Skip to content

Commit 31ce22f

Browse files
committed
added support for arrays in dynamic invocations
1 parent 97aa127 commit 31ce22f

File tree

1 file changed

+47
-2
lines changed

1 file changed

+47
-2
lines changed

soot-infoflow/src/soot/jimple/infoflow/AbstractInfoflow.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.slf4j.LoggerFactory;
2121

2222
import heros.solver.Pair;
23+
import soot.ArrayType;
2324
import soot.Body;
2425
import soot.BooleanType;
2526
import soot.ByteType;
@@ -39,6 +40,7 @@
3940
import soot.PointsToAnalysis;
4041
import soot.RefType;
4142
import soot.Scene;
43+
import soot.ShortType;
4244
import soot.SootClass;
4345
import soot.SootMethod;
4446
import soot.SootMethodRef;
@@ -627,6 +629,8 @@ private static List<Stmt> patchStringConcatInstruction(Stmt callSite, DynamicInv
627629
SootMethodRef toStringRef = scene.getObjectType().getSootClass().getMethod("java.lang.String toString()")
628630
.makeRef();
629631

632+
SootClass scArrays = Scene.v().getSootClass("java.util.Arrays");
633+
630634
List<Stmt> newStmts = new ArrayList<>();
631635
NumberedString calleeSubSig = diexpr.getBootstrapMethodRef().getSubSignature();
632636
if (calleeSubSig.equals(scene.getSubSigNumberer().findOrAdd(SIG_CONCAT_CONSTANTS))
@@ -657,15 +661,56 @@ else if (argType instanceof BooleanType)
657661
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(boolean)").makeRef();
658662
else if (argType instanceof CharType)
659663
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(char)").makeRef();
664+
else if (argType instanceof ShortType)
665+
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(short)").makeRef();
660666
else if (argType instanceof IntType)
661667
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(int)").makeRef();
662668
else if (argType instanceof LongType)
663669
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(long)").makeRef();
664670
else if (argType instanceof FloatType)
665671
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(float)").makeRef();
666672
else if (argType instanceof DoubleType)
667-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(doble)").makeRef();
668-
else {
673+
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(double)").makeRef();
674+
else if (argType instanceof ArrayType) {
675+
// For an array argument, we need to Arrays.toString() first
676+
ArrayType at = (ArrayType) argType;
677+
Type elementType = at.getElementType();
678+
679+
Local sarg = lg.generateLocal(RefType.v("java.lang.String"));
680+
SootMethodRef elementToStringRef = null;
681+
if (elementType instanceof RefType)
682+
elementToStringRef = scArrays.getMethod("java.lang.String toString(java.lang.Object[])")
683+
.makeRef();
684+
else if (elementType instanceof ByteType)
685+
elementToStringRef = scArrays.getMethod("java.lang.String toString(byte[])").makeRef();
686+
else if (elementType instanceof BooleanType)
687+
elementToStringRef = scArrays.getMethod("java.lang.String toString(boolean[])").makeRef();
688+
else if (elementType instanceof CharType)
689+
elementToStringRef = scArrays.getMethod("java.lang.String toString(char[])").makeRef();
690+
else if (elementType instanceof ShortType)
691+
elementToStringRef = scArrays.getMethod("java.lang.String toString(short[])").makeRef();
692+
else if (elementType instanceof IntType)
693+
elementToStringRef = scArrays.getMethod("java.lang.String toString(int[])").makeRef();
694+
else if (elementType instanceof LongType)
695+
elementToStringRef = scArrays.getMethod("java.lang.String toString(long[])").makeRef();
696+
else if (elementType instanceof FloatType)
697+
elementToStringRef = scArrays.getMethod("java.lang.String toString(float[])").makeRef();
698+
else if (elementType instanceof DoubleType)
699+
elementToStringRef = scArrays.getMethod("java.lang.String toString(double[])").makeRef();
700+
else {
701+
throw new RuntimeException(String.format(
702+
"Invalid array element type %s for string concatenation in dynamic invocation",
703+
elementType.toString()));
704+
}
705+
706+
Stmt toStringStmt = jimple.newAssignStmt(sarg,
707+
jimple.newStaticInvokeExpr(elementToStringRef, Collections.singletonList(arg)));
708+
toStringStmt.addTag(SimulatedCodeElementTag.TAG);
709+
newStmts.add(toStringStmt);
710+
711+
arg = sarg;
712+
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(java.lang.String)").makeRef();
713+
} else {
669714
throw new RuntimeException(String.format(
670715
"Invalid type %s for string concatenation in dynamic invocation", argType.toString()));
671716
}

0 commit comments

Comments
 (0)