Skip to content

Commit 2b13693

Browse files
committed
accept phantom method references in dynamic invocation rewriting
1 parent 726a0cf commit 2b13693

File tree

1 file changed

+24
-23
lines changed

1 file changed

+24
-23
lines changed

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

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -624,10 +624,10 @@ private static List<Stmt> patchStringConcatInstruction(Stmt callSite, DynamicInv
624624

625625
RefType rtStringBuilder = RefType.v("java.lang.StringBuilder");
626626
SootClass scStringBuilder = rtStringBuilder.getSootClass();
627-
SootMethodRef appendObjectRef = scStringBuilder.getMethod("java.lang.StringBuilder append(java.lang.Object)")
628-
.makeRef();
629-
SootMethodRef toStringRef = scene.getObjectType().getSootClass().getMethod("java.lang.String toString()")
630-
.makeRef();
627+
SootMethodRef appendObjectRef = scene.makeMethodRef(scStringBuilder,
628+
"java.lang.StringBuilder append(java.lang.Object)", false);
629+
SootMethodRef toStringRef = scene.makeMethodRef(scene.getObjectType().getSootClass(),
630+
"java.lang.String toString()", false);
631631

632632
SootClass scArrays = Scene.v().getSootClass("java.util.Arrays");
633633

@@ -643,7 +643,7 @@ private static List<Stmt> patchStringConcatInstruction(Stmt callSite, DynamicInv
643643
newStmts.add(stmt);
644644

645645
stmt = jimple.newInvokeStmt(jimple.newSpecialInvokeExpr(sb,
646-
scStringBuilder.getMethod("void <init>(java.lang.String)").makeRef()));
646+
scene.makeMethodRef(scStringBuilder, "void <init>(java.lang.String)", false)));
647647
stmt.addTag(SimulatedCodeElementTag.TAG);
648648
newStmts.add(stmt);
649649

@@ -656,21 +656,21 @@ private static List<Stmt> patchStringConcatInstruction(Stmt callSite, DynamicInv
656656
if (argType instanceof RefType)
657657
appendRef = appendObjectRef;
658658
else if (argType instanceof ByteType)
659-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(byte)").makeRef();
659+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(byte)", false);
660660
else if (argType instanceof BooleanType)
661-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(boolean)").makeRef();
661+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(boolean)", false);
662662
else if (argType instanceof CharType)
663-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(char)").makeRef();
663+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(char)", false);
664664
else if (argType instanceof ShortType)
665-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(short)").makeRef();
665+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(short)", false);
666666
else if (argType instanceof IntType)
667-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(int)").makeRef();
667+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(int)", false);
668668
else if (argType instanceof LongType)
669-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(long)").makeRef();
669+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(long)", false);
670670
else if (argType instanceof FloatType)
671-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(float)").makeRef();
671+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(float)", false);
672672
else if (argType instanceof DoubleType)
673-
appendRef = scStringBuilder.getMethod("java.lang.StringBuilder append(double)").makeRef();
673+
appendRef = scene.makeMethodRef(scStringBuilder, "java.lang.StringBuilder append(double)", false);
674674
else if (argType instanceof ArrayType) {
675675
// For an array argument, we need to Arrays.toString() first
676676
ArrayType at = (ArrayType) argType;
@@ -679,24 +679,25 @@ else if (argType instanceof ArrayType) {
679679
Local sarg = lg.generateLocal(RefType.v("java.lang.String"));
680680
SootMethodRef elementToStringRef = null;
681681
if (elementType instanceof RefType)
682-
elementToStringRef = scArrays.getMethod("java.lang.String toString(java.lang.Object[])")
683-
.makeRef();
682+
elementToStringRef = scene.makeMethodRef(scArrays,
683+
"java.lang.String toString(java.lang.Object[])", true);
684684
else if (elementType instanceof ByteType)
685-
elementToStringRef = scArrays.getMethod("java.lang.String toString(byte[])").makeRef();
685+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(byte[])", true);
686686
else if (elementType instanceof BooleanType)
687-
elementToStringRef = scArrays.getMethod("java.lang.String toString(boolean[])").makeRef();
687+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(boolean[])",
688+
true);
688689
else if (elementType instanceof CharType)
689-
elementToStringRef = scArrays.getMethod("java.lang.String toString(char[])").makeRef();
690+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(char[])", true);
690691
else if (elementType instanceof ShortType)
691-
elementToStringRef = scArrays.getMethod("java.lang.String toString(short[])").makeRef();
692+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(short[])", true);
692693
else if (elementType instanceof IntType)
693-
elementToStringRef = scArrays.getMethod("java.lang.String toString(int[])").makeRef();
694+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(int[])", true);
694695
else if (elementType instanceof LongType)
695-
elementToStringRef = scArrays.getMethod("java.lang.String toString(long[])").makeRef();
696+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(long[])", true);
696697
else if (elementType instanceof FloatType)
697-
elementToStringRef = scArrays.getMethod("java.lang.String toString(float[])").makeRef();
698+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(float[])", true);
698699
else if (elementType instanceof DoubleType)
699-
elementToStringRef = scArrays.getMethod("java.lang.String toString(double[])").makeRef();
700+
elementToStringRef = scene.makeMethodRef(scArrays, "java.lang.String toString(double[])", true);
700701
else {
701702
throw new RuntimeException(String.format(
702703
"Invalid array element type %s for string concatenation in dynamic invocation",

0 commit comments

Comments
 (0)