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 bc7243a64130c566875476066c12ee84665e22b3..9f67ad24599fcf5ea9566bc22f9c9e0d87e4b655 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 0000000000000000000000000000000000000000..a4019f2422f640b308eb1e02f7ed9cfbbd2a8e8b --- /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;")); + } +}