Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jadx
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open-source
jadx
Commits
7f4e6418
Commit
7f4e6418
authored
Feb 15, 2019
by
Skylot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: skip duplicated block in complex if (#441)
parent
710245d5
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
687 additions
and
1 deletion
+687
-1
IfMakerHelper.java
...in/java/jadx/core/dex/visitors/regions/IfMakerHelper.java
+12
-1
TestComplexIf.java
...java/jadx/tests/integration/conditions/TestComplexIf.java
+39
-0
TestComplexIf.smali
jadx-core/src/test/smali/conditions/TestComplexIf.smali
+636
-0
No files found.
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfMakerHelper.java
View file @
7f4e6418
...
...
@@ -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
;
}
...
...
jadx-core/src/test/java/jadx/tests/integration/conditions/TestComplexIf.java
0 → 100644
View file @
7f4e6418
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\")) {"
));
}
}
jadx-core/src/test/smali/conditions/TestComplexIf.smali
0 → 100644
View file @
7f4e6418
.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 <init>()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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment