fix: variable usage with enhanced for loop (#535) (PR #547)

This commit is contained in:
Ahmed Ashour
2019-04-01 20:07:28 +02:00
committed by skylot
parent 3970fce503
commit e6e8f6367e
4 changed files with 65 additions and 52 deletions
@@ -125,6 +125,7 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor
// all checks passed
initInsn.add(AFlag.DONT_GENERATE);
incrInsn.add(AFlag.DONT_GENERATE);
LoopType arrForEach = checkArrayForEach(mth, loopRegion, initInsn, incrInsn, condition);
if (arrForEach != null) {
loopRegion.setType(arrForEach);
@@ -281,6 +282,8 @@ public class LoopRegionVisitor extends AbstractVisitor implements IRegionVisitor
}
assignInsn.add(AFlag.DONT_GENERATE);
assignInsn.getResult().add(AFlag.DONT_GENERATE);
for (InsnNode insnNode : toSkip) {
insnNode.add(AFlag.DONT_GENERATE);
}
@@ -18,13 +18,8 @@ import jadx.core.dex.regions.loops.LoopType;
import jadx.core.dex.visitors.regions.TracedRegionVisitor;
class CollectUsageRegionVisitor extends TracedRegionVisitor {
private final List<RegisterArg> args;
private final Map<SSAVar, VarUsage> usageMap;
public CollectUsageRegionVisitor() {
this.usageMap = new LinkedHashMap<>();
this.args = new ArrayList<>();
}
private final List<RegisterArg> args = new ArrayList<>();
private final Map<SSAVar, VarUsage> usageMap = new LinkedHashMap<>();
public Map<SSAVar, VarUsage> getUsageMap() {
return usageMap;
@@ -37,9 +32,6 @@ class CollectUsageRegionVisitor extends TracedRegionVisitor {
int len = block.getInstructions().size();
for (int i = 0; i < len; i++) {
InsnNode insn = block.getInstructions().get(i);
if (insn.contains(AFlag.DONT_GENERATE)) {
continue;
}
processInsn(insn, usePlace);
}
}
@@ -73,11 +65,10 @@ class CollectUsageRegionVisitor extends TracedRegionVisitor {
args.clear();
insn.getRegisterArgs(args);
for (RegisterArg arg : args) {
if (arg.contains(AFlag.DONT_GENERATE)) {
continue;
if (!arg.contains(AFlag.DONT_GENERATE)) {
VarUsage usage = getUsage(arg.getSVar());
usage.getUses().add(usePlace);
}
VarUsage usage = getUsage(arg.getSVar());
usage.getUses().add(usePlace);
}
}
@@ -1,38 +0,0 @@
package jadx.tests.integration.variables;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
import jadx.NotYetImplemented;
import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.IntegrationTest;
public class TestVariables7 extends IntegrationTest {
public static class TestCls {
public void test() {
List list;
synchronized (this) {
list = new ArrayList();
}
for (Object o : list) {
System.out.println(o);
}
}
}
@Test
@NotYetImplemented
public void test() {
ClassNode cls = getClassNode(TestCls.class);
String code = cls.getCode().toString();
assertThat(code, containsString(" list = new ArrayList"));
}
}
@@ -0,0 +1,57 @@
package jadx.tests.integration.variables;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
import jadx.core.dex.nodes.ClassNode;
import jadx.tests.api.IntegrationTest;
public class TestVariablesUsageWithLoops extends IntegrationTest {
public static class TestEnhancedFor {
public void test() {
List list;
synchronized (this) {
list = new ArrayList();
}
for (Object o : list) {
System.out.println(o);
}
}
}
@Test
public void testEnhancedFor() {
ClassNode cls = getClassNode(TestEnhancedFor.class);
String code = cls.getCode().toString();
assertThat(code, containsString(" list = new ArrayList"));
}
public static class TestForLoop {
public void test() {
List list;
synchronized (this) {
list = new ArrayList();
}
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
}
}
}
@Test
public void testForLoop() {
ClassNode cls = getClassNode(TestForLoop.class);
String code = cls.getCode().toString();
assertThat(code, containsString(" list = new ArrayList"));
}
}