@@ -17,14 +17,17 @@ import soot.CharType
1717import soot.DoubleType
1818import soot.FloatType
1919import soot.IntType
20+ import soot.Local
2021import soot.LongType
2122import soot.ShortType
2223import soot.Unit
2324import soot.Value
2425import soot.ValueBox
2526import soot.jimple.Constant
27+ import soot.jimple.IntConstant
2628import soot.jimple.InvokeExpr
2729import soot.jimple.NullConstant
30+ import soot.jimple.internal.AbstractSwitchStmt
2831import soot.jimple.internal.ImmediateBox
2932import soot.jimple.internal.JAssignStmt
3033import soot.jimple.internal.JCastExpr
@@ -33,8 +36,10 @@ import soot.jimple.internal.JGeExpr
3336import soot.jimple.internal.JGtExpr
3437import soot.jimple.internal.JIfStmt
3538import soot.jimple.internal.JLeExpr
39+ import soot.jimple.internal.JLookupSwitchStmt
3640import soot.jimple.internal.JLtExpr
3741import soot.jimple.internal.JNeExpr
42+ import soot.jimple.internal.JTableSwitchStmt
3843import soot.jimple.internal.JVirtualInvokeExpr
3944import soot.toolkits.graph.ExceptionalUnitGraph
4045
@@ -45,17 +50,18 @@ private val logger = KotlinLogging.logger {}
4550 */
4651fun 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+
161185private 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