@@ -17,14 +17,17 @@ import soot.CharType
17
17
import soot.DoubleType
18
18
import soot.FloatType
19
19
import soot.IntType
20
+ import soot.Local
20
21
import soot.LongType
21
22
import soot.ShortType
22
23
import soot.Unit
23
24
import soot.Value
24
25
import soot.ValueBox
25
26
import soot.jimple.Constant
27
+ import soot.jimple.IntConstant
26
28
import soot.jimple.InvokeExpr
27
29
import soot.jimple.NullConstant
30
+ import soot.jimple.internal.AbstractSwitchStmt
28
31
import soot.jimple.internal.ImmediateBox
29
32
import soot.jimple.internal.JAssignStmt
30
33
import soot.jimple.internal.JCastExpr
@@ -33,8 +36,10 @@ import soot.jimple.internal.JGeExpr
33
36
import soot.jimple.internal.JGtExpr
34
37
import soot.jimple.internal.JIfStmt
35
38
import soot.jimple.internal.JLeExpr
39
+ import soot.jimple.internal.JLookupSwitchStmt
36
40
import soot.jimple.internal.JLtExpr
37
41
import soot.jimple.internal.JNeExpr
42
+ import soot.jimple.internal.JTableSwitchStmt
38
43
import soot.jimple.internal.JVirtualInvokeExpr
39
44
import soot.toolkits.graph.ExceptionalUnitGraph
40
45
@@ -45,17 +50,18 @@ private val logger = KotlinLogging.logger {}
45
50
*/
46
51
fun collectConstantsForFuzzer (graph : ExceptionalUnitGraph ): Set <FuzzedConcreteValue > {
47
52
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 }
49
54
.flatMap { unit ->
50
55
unit.useBoxes.map { unit to it.value }
51
56
}
52
57
.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
54
59
}
55
60
.flatMap { (unit, value) ->
56
61
sequenceOf(
57
62
ConstantsFromIfStatement ,
58
63
ConstantsFromCast ,
64
+ ConstantsFromSwitchCase ,
59
65
BoundValuesForDoubleChecks ,
60
66
StringConstant ,
61
67
).flatMap { finder ->
@@ -158,6 +164,24 @@ private object ConstantsFromCast: ConstantsFinder {
158
164
159
165
}
160
166
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
+
161
185
private object BoundValuesForDoubleChecks: ConstantsFinder {
162
186
override fun find (graph : ExceptionalUnitGraph , unit : Unit , value : Value ): List <FuzzedConcreteValue > {
163
187
if (value !is InvokeExpr ) return emptyList()
0 commit comments