Skip to content

Commit 2a2173a

Browse files
authored
Fuzzer fails to find combinations with constants from switch-case (#294)
1 parent 1e4a99f commit 2a2173a

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

utbot-framework/src/main/kotlin/org/utbot/fuzzer/FuzzerFunctions.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@ import soot.CharType
1717
import soot.DoubleType
1818
import soot.FloatType
1919
import soot.IntType
20+
import soot.Local
2021
import soot.LongType
2122
import soot.ShortType
2223
import soot.Unit
2324
import soot.Value
2425
import soot.ValueBox
2526
import soot.jimple.Constant
27+
import soot.jimple.IntConstant
2628
import soot.jimple.InvokeExpr
2729
import soot.jimple.NullConstant
30+
import soot.jimple.internal.AbstractSwitchStmt
2831
import soot.jimple.internal.ImmediateBox
2932
import soot.jimple.internal.JAssignStmt
3033
import soot.jimple.internal.JCastExpr
@@ -33,8 +36,10 @@ import soot.jimple.internal.JGeExpr
3336
import soot.jimple.internal.JGtExpr
3437
import soot.jimple.internal.JIfStmt
3538
import soot.jimple.internal.JLeExpr
39+
import soot.jimple.internal.JLookupSwitchStmt
3640
import soot.jimple.internal.JLtExpr
3741
import soot.jimple.internal.JNeExpr
42+
import soot.jimple.internal.JTableSwitchStmt
3843
import soot.jimple.internal.JVirtualInvokeExpr
3944
import soot.toolkits.graph.ExceptionalUnitGraph
4045

@@ -45,17 +50,18 @@ private val logger = KotlinLogging.logger {}
4550
*/
4651
fun collectConstantsForFuzzer(graph: ExceptionalUnitGraph): Set<FuzzedConcreteValue> {
4752
return graph.body.units.reversed().asSequence()
48-
.filter { it is JIfStmt || it is JAssignStmt }
53+
.filter { it is JIfStmt || it is JAssignStmt || it is AbstractSwitchStmt}
4954
.flatMap { unit ->
5055
unit.useBoxes.map { unit to it.value }
5156
}
5257
.filter { (_, value) ->
53-
value is Constant || value is JCastExpr || value is InvokeExpr
58+
value is Constant || value is Local || value is JCastExpr || value is InvokeExpr
5459
}
5560
.flatMap { (unit, value) ->
5661
sequenceOf(
5762
ConstantsFromIfStatement,
5863
ConstantsFromCast,
64+
ConstantsFromSwitchCase,
5965
BoundValuesForDoubleChecks,
6066
StringConstant,
6167
).flatMap { finder ->
@@ -158,6 +164,24 @@ private object ConstantsFromCast: ConstantsFinder {
158164

159165
}
160166

167+
private object ConstantsFromSwitchCase: ConstantsFinder {
168+
override fun find(graph: ExceptionalUnitGraph, unit: Unit, value: Value): List<FuzzedConcreteValue> {
169+
if (unit !is JTableSwitchStmt && unit !is JLookupSwitchStmt) return emptyList()
170+
val result = mutableListOf<FuzzedConcreteValue>()
171+
if (unit is JTableSwitchStmt) {
172+
for (i in unit.lowIndex..unit.highIndex) {
173+
result.add(FuzzedConcreteValue(intClassId, i, FuzzedOp.EQ))
174+
}
175+
}
176+
if (unit is JLookupSwitchStmt) {
177+
unit.lookupValues.asSequence().filterIsInstance<IntConstant>().forEach {
178+
result.add(FuzzedConcreteValue(intClassId, it.value, FuzzedOp.EQ))
179+
}
180+
}
181+
return result
182+
}
183+
}
184+
161185
private object BoundValuesForDoubleChecks: ConstantsFinder {
162186
override fun find(graph: ExceptionalUnitGraph, unit: Unit, value: Value): List<FuzzedConcreteValue> {
163187
if (value !is InvokeExpr) return emptyList()

0 commit comments

Comments
 (0)