From ec8309af495e4c5fe6455c82f4710ee9321ecc1b Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 20 Aug 2014 22:00:44 +0400 Subject: [PATCH] core: fix processing 'if' at loop end --- .../dex/visitors/regions/IfMakerHelper.java | 4 +- .../internal/loops/TestLoopDetection4.java | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/internal/loops/TestLoopDetection4.java diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfMakerHelper.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfMakerHelper.java index bc7243a64..9f67ad245 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfMakerHelper.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfMakerHelper.java @@ -47,8 +47,8 @@ public class IfMakerHelper { info.setOutBlock(null); return info; } - boolean badThen = !allPathsFromIf(thenBlock, info); - boolean badElse = !allPathsFromIf(elseBlock, info); + boolean badThen = thenBlock.contains(AFlag.LOOP_START) || !allPathsFromIf(thenBlock, info); + boolean badElse = elseBlock.contains(AFlag.LOOP_START) || !allPathsFromIf(elseBlock, info); if (badThen && badElse) { LOG.debug("Stop processing blocks after 'if': {}, method: {}", info.getIfBlock(), mth); return null; diff --git a/jadx-core/src/test/java/jadx/tests/internal/loops/TestLoopDetection4.java b/jadx-core/src/test/java/jadx/tests/internal/loops/TestLoopDetection4.java new file mode 100644 index 000000000..a4019f242 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/internal/loops/TestLoopDetection4.java @@ -0,0 +1,48 @@ +package jadx.tests.internal.loops; + +import jadx.api.InternalJadxTest; +import jadx.core.dex.nodes.ClassNode; + +import java.util.Iterator; + +import org.junit.Test; + +import static jadx.tests.utils.JadxMatchers.containsOne; +import static org.junit.Assert.assertThat; + +public class TestLoopDetection4 extends InternalJadxTest { + + public static class TestCls { + private Iterator iterator; + private SomeCls filter; + + private String test() { + while (iterator.hasNext()) { + String next = iterator.next(); + String filtered = filter.filter(next); + if (filtered != null) { + return filtered; + } + } + return null; + } + + private class SomeCls { + public String filter(String str) { + return str; + } + } + } + + @Test + public void test() { + ClassNode cls = getClassNode(TestCls.class); + String code = cls.getCode().toString(); + System.out.println(code); + + assertThat(code, containsOne("while (this.iterator.hasNext()) {")); + assertThat(code, containsOne("if (filtered != null) {")); + assertThat(code, containsOne("return filtered;")); + assertThat(code, containsOne("return null;")); + } +}