From 077bd45ea1bf3c708695894693906c4e437ceb17 Mon Sep 17 00:00:00 2001 From: Marc Miltenberger Date: Sun, 12 Jan 2025 13:04:23 +0100 Subject: [PATCH] Make sure that we do not have branch statements within array initializer blocks Make sure that we do not have branch statements within array initializer blocks. Otherwise we get unplaced labels. --- src/main/java/soot/toDex/DexArrayInitDetector.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/soot/toDex/DexArrayInitDetector.java b/src/main/java/soot/toDex/DexArrayInitDetector.java index 8294beaca7c..dca28851828 100644 --- a/src/main/java/soot/toDex/DexArrayInitDetector.java +++ b/src/main/java/soot/toDex/DexArrayInitDetector.java @@ -36,12 +36,14 @@ import soot.Value; import soot.jimple.ArrayRef; import soot.jimple.AssignStmt; +import soot.jimple.BranchableStmt; import soot.jimple.Constant; import soot.jimple.DoubleConstant; import soot.jimple.FloatConstant; import soot.jimple.IntConstant; import soot.jimple.LongConstant; import soot.jimple.NewArrayExpr; +import soot.jimple.Stmt; /** * Detector class that identifies array initializations and packs them into a single instruction: @@ -76,6 +78,12 @@ public void constructArrayInitializations(Body body) { Set curIgnoreUnits = null; int arraySize = 0; Value concernedArray = null; + Set directGotoTargets = new HashSet<>(); + for (Unit u : body.getUnits()) { + if (u instanceof BranchableStmt) { + directGotoTargets.add((Stmt) ((BranchableStmt) u).getTarget()); + } + } for (Unit u : body.getUnits()) { if (!(u instanceof AssignStmt)) { arrayValues = null; @@ -105,7 +113,7 @@ public void constructArrayInitializations(Body body) { if (rop instanceof IntConstant || rop instanceof LongConstant || rop instanceof FloatConstant || rop instanceof DoubleConstant) { ArrayRef aref = (ArrayRef) assignStmt.getLeftOp(); - if (aref.getBase() != concernedArray) { + if (aref.getBase() != concernedArray || directGotoTargets.contains(assignStmt)) { arrayValues = null; continue; }