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 38d947258925ea7907306abfb7db8288cadbee92..d2f56d9b23317be7011d38fd5951e616784b8887 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 @@ -263,7 +263,18 @@ public class IfMakerHelper { result.setIfBlock(first.getIfBlock()); result.merge(first, second); - BlockNode otherPathBlock = followThenBranch ? first.getElseBlock() : first.getThenBlock(); + BlockNode otherPathBlock; + if (followThenBranch) { + otherPathBlock = first.getElseBlock(); + if (!otherPathBlock.equals(result.getElseBlock())) { + result.getSkipBlocks().add(otherPathBlock); + } + } else { + otherPathBlock = first.getThenBlock(); + if (!otherPathBlock.equals(result.getThenBlock())) { + result.getSkipBlocks().add(otherPathBlock); + } + } skipSimplePath(otherPathBlock, result.getSkipBlocks()); return result; } diff --git a/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java new file mode 100644 index 0000000000000000000000000000000000000000..5ac1dab3fea4dc70a96bc8ce4fb1d4b4672aad52 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java @@ -0,0 +1,39 @@ +package jadx.tests.integration.conditions; + +import org.junit.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static jadx.tests.api.utils.JadxMatchers.containsOne; +import static org.junit.Assert.assertThat; + +public class TestComplexIf extends SmaliTest { + +/* + public final class TestComplexIf { + private String a; + private int b; + private float c; + + public final boolean test() { + if (this.a.equals("GT-P6200") || this.a.equals("GT-P6210") || ... ) { + return true; + } + if (this.a.equals("SM-T810") || this.a.equals("SM-T813") || ...) { + return false; + } + return this.c > 160.0f ? true : this.c <= 0.0f && ((this.b & 15) == 4 ? 1 : null) != null; + } + } + */ + + @Test + public void test() { + ClassNode cls = getClassNodeFromSmaliWithPkg("conditions", "TestComplexIf"); + String code = cls.getCode().toString(); + + assertThat(code, containsOne("if (this.a.equals(\"GT-P6200\") || this.a.equals(\"GT-P6210\") || this.a.equals(\"A100\") " + + "|| this.a.equals(\"A101\") || this.a.equals(\"LIFETAB_S786X\") || this.a.equals(\"VS890 4G\")) {")); + } +} diff --git a/jadx-core/src/test/smali/conditions/TestComplexIf.smali b/jadx-core/src/test/smali/conditions/TestComplexIf.smali new file mode 100644 index 0000000000000000000000000000000000000000..678ebd42dc2445b06e33247e8b2affc536032c05 --- /dev/null +++ b/jadx-core/src/test/smali/conditions/TestComplexIf.smali @@ -0,0 +1,636 @@ +.class public final Lconditions/TestComplexIf; +.super Ljava/lang/Object; + + +# instance fields +.field private a:Ljava/lang/String; + +.field private b:I + +.field private c:F + + +# direct methods +.method public constructor ()V + .locals 1 + return-void +.end method + +.method public final test()Z + .locals 5 + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v1, "GT-P6200" + + invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + const/4 v1, 0x1 + + if-nez v0, :cond_b + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v2, "GT-P6210" + + invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_b + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v2, "A100" + + invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_b + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v2, "A101" + + invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_b + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v2, "LIFETAB_S786X" + + invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_0 + + goto/16 :goto_2 + + :cond_0 + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v2, "VS890 4G" + + invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_1 + + return v1 + + :cond_1 + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v2, "SM-T810" + + invoke-virtual {v0, v2}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + const/4 v2, 0x0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T813" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T815" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T815N0" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T815Y" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T820" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T825" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-P585" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-P585N0" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T561" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T567V" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T320" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T321" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T325" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T700" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T705" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T705M" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T705Y" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SC-03G" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "GT-N5100" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "GT-N5105" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "GT-N5110" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "GT-N5120" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SHW-M500W" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T310" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T311" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T315" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T330" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T330NU" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T331" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T335" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T337V" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T710" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T715" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T715N0" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SM-T719" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "GT-P6800" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "SC-01E" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_2 + + goto/16 :goto_1 + + :cond_2 + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "LG-V500" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "LG-V930" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_3 + + goto/16 :goto_1 + + :cond_3 + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "P01T_1" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "P01MA" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "Nexus 9" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "ASUS_P00I" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_4 + + goto :goto_1 + + :cond_4 + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "Lenovo YT3-X90X" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-nez v0, :cond_a + + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "Lenovo YT-X703F" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_5 + + goto :goto_1 + + :cond_5 + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "PMT3408_4G" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_6 + + return v2 + + :cond_6 + iget-object v0, p0, Lconditions/TestComplexIf;->a:Ljava/lang/String; + + const-string v3, "MediaPad T2 10.0 Pro" + + invoke-virtual {v0, v3}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v0 + + if-eqz v0, :cond_7 + + return v2 + + :cond_7 + iget-object v0, p0, Lconditions/TestComplexIf;->b:I + + and-int/lit8 v0, v0, 0xf + + const/4 v3, 0x4 + + if-ne v0, v3, :cond_8 + + const/4 v0, 0x1 + + goto :goto_0 + + :cond_8 + const/4 v0, 0x0 + + :goto_0 + iget v3, p0, Lconditions/TestComplexIf;->c:F + + const/high16 v4, 0x43200000 # 160.0f + + cmpl-float v3, v3, v4 + + if-lez v3, :cond_9 + + return v1 + + :cond_9 + iget v3, p0, Lconditions/TestComplexIf;->c:F + + const/4 v4, 0x0 + + cmpg-float v3, v3, v4 + + if-gtz v3, :cond_a + + if-eqz v0, :cond_a + + return v1 + + :cond_a + :goto_1 + return v2 + + :cond_b + :goto_2 + return v1 +.end method