Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
colcode
jadx
提交
7492889f
J
jadx
项目概览
colcode
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
7492889f
编写于
8月 23, 2018
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
core: prevent endless region processing (#340)
上级
0c041120
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
33 addition
and
14 deletion
+33
-14
jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java
...core/src/main/java/jadx/core/dex/instructions/IfNode.java
+6
-3
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfMakerHelper.java
...in/java/jadx/core/dex/visitors/regions/IfMakerHelper.java
+7
-0
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
...main/java/jadx/core/dex/visitors/regions/RegionMaker.java
+14
-8
jadx-core/src/test/java/jadx/tests/integration/TestWrongCode.java
...e/src/test/java/jadx/tests/integration/TestWrongCode.java
+6
-3
未找到文件。
jadx-core/src/main/java/jadx/core/dex/instructions/IfNode.java
浏览文件 @
7492889f
package
jadx.core.dex.instructions
;
import
java.util.List
;
import
com.android.dx.io.instructions.DecodedInstruction
;
import
jadx.core.dex.instructions.args.ArgType
;
...
...
@@ -57,11 +59,12 @@ public class IfNode extends GotoNode {
@Override
public
void
initBlocks
(
BlockNode
curBlock
)
{
thenBlock
=
getBlockByOffset
(
target
,
curBlock
.
getSuccessors
());
if
(
curBlock
.
getSuccessors
().
size
()
==
1
)
{
List
<
BlockNode
>
successors
=
curBlock
.
getSuccessors
();
thenBlock
=
getBlockByOffset
(
target
,
successors
);
if
(
successors
.
size
()
==
1
)
{
elseBlock
=
thenBlock
;
}
else
{
elseBlock
=
selectOther
(
thenBlock
,
curBlock
.
getSuccessors
()
);
elseBlock
=
selectOther
(
thenBlock
,
successors
);
}
}
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfMakerHelper.java
浏览文件 @
7492889f
...
...
@@ -2,6 +2,7 @@ package jadx.core.dex.visitors.regions;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Set
;
import
org.slf4j.Logger
;
...
...
@@ -52,6 +53,12 @@ public class IfMakerHelper {
BlockNode
thenBlock
=
info
.
getThenBlock
();
BlockNode
elseBlock
=
info
.
getElseBlock
();
if
(
Objects
.
equals
(
thenBlock
,
elseBlock
))
{
IfInfo
ifInfo
=
new
IfInfo
(
info
,
null
,
null
);
ifInfo
.
setOutBlock
(
thenBlock
);
return
ifInfo
;
}
// select 'then', 'else' and 'exit' blocks
if
(
thenBlock
.
contains
(
AFlag
.
RETURN
)
&&
elseBlock
.
contains
(
AFlag
.
RETURN
))
{
info
.
setOutBlock
(
null
);
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
浏览文件 @
7492889f
...
...
@@ -60,21 +60,26 @@ public class RegionMaker {
private
final
MethodNode
mth
;
private
int
regionsCount
;
private
Region
[]
regionByBlock
;
private
BitSet
processedBlocks
;
public
RegionMaker
(
MethodNode
mth
)
{
this
.
mth
=
mth
;
this
.
regionByBlock
=
new
Region
[
mth
.
getBasicBlocks
().
size
()]
;
this
.
processedBlocks
=
new
BitSet
(
mth
.
getBasicBlocks
().
size
())
;
}
public
Region
makeRegion
(
BlockNode
startBlock
,
RegionStack
stack
)
{
Region
r
=
new
Region
(
stack
.
peekRegion
());
if
(
startBlock
==
null
)
{
return
r
;
}
int
startBlockId
=
startBlock
.
getId
();
Region
region
=
regionByBlock
[
startBlockId
];
if
(
region
!=
null
)
{
return
r
egion
;
if
(
processedBlocks
.
get
(
startBlockId
))
{
mth
.
addWarn
(
"Removed duplicated region for block: "
+
startBlock
+
" "
+
startBlock
.
getAttributesString
());
return
r
;
}
processedBlocks
.
set
(
startBlockId
);
Region
r
=
new
Region
(
stack
.
peekRegion
());
BlockNode
next
=
startBlock
;
while
(
next
!=
null
)
{
next
=
traverse
(
r
,
next
,
stack
);
...
...
@@ -83,7 +88,6 @@ public class RegionMaker {
throw
new
JadxRuntimeException
(
"Regions count limit reached"
);
}
}
regionByBlock
[
startBlockId
]
=
r
;
return
r
;
}
...
...
@@ -201,6 +205,7 @@ public class RegionMaker {
loopStart
.
remove
(
AType
.
LOOP
);
loop
.
getEnd
().
add
(
AFlag
.
SKIP
);
stack
.
addExit
(
loop
.
getEnd
());
processedBlocks
.
clear
(
loopStart
.
getId
());
Region
body
=
makeRegion
(
loopStart
,
stack
);
loopRegion
.
setBody
(
body
);
loopStart
.
addAttr
(
AType
.
LOOP
,
loop
);
...
...
@@ -296,6 +301,7 @@ public class RegionMaker {
curRegion
.
getSubBlocks
().
add
(
loopRegion
);
loopStart
.
remove
(
AType
.
LOOP
);
processedBlocks
.
clear
(
loopStart
.
getId
());
stack
.
push
(
loopRegion
);
BlockNode
out
=
null
;
...
...
@@ -850,7 +856,7 @@ public class RegionMaker {
}
private
Map
<
BlockNode
,
List
<
Object
>>
reOrderSwitchCases
(
Map
<
BlockNode
,
List
<
Object
>>
blocksMap
,
Map
<
BlockNode
,
BlockNode
>
fallThroughCases
)
{
Map
<
BlockNode
,
BlockNode
>
fallThroughCases
)
{
List
<
BlockNode
>
list
=
new
ArrayList
<>(
blocksMap
.
size
());
list
.
addAll
(
blocksMap
.
keySet
());
list
.
sort
((
a
,
b
)
->
{
...
...
jadx-core/src/test/java/jadx/tests/integration/TestWrongCode.java
浏览文件 @
7492889f
...
...
@@ -5,6 +5,7 @@ import org.junit.Test;
import
jadx.core.dex.nodes.ClassNode
;
import
jadx.tests.api.IntegrationTest
;
import
static
jadx
.
tests
.
api
.
utils
.
JadxMatchers
.
containsLines
;
import
static
jadx
.
tests
.
api
.
utils
.
JadxMatchers
.
containsOne
;
import
static
org
.
hamcrest
.
CoreMatchers
.
containsString
;
import
static
org
.
hamcrest
.
CoreMatchers
.
not
;
...
...
@@ -18,10 +19,8 @@ public class TestWrongCode extends IntegrationTest {
return
a
.
length
;
}
@SuppressWarnings
(
"empty"
)
private
int
test2
(
int
a
)
{
if
(
a
==
0
)
{
;
}
return
a
;
}
...
...
@@ -36,7 +35,11 @@ public class TestWrongCode extends IntegrationTest {
assertThat
(
code
,
containsOne
(
"int[] a = null;"
));
assertThat
(
code
,
containsOne
(
"return a.length;"
));
assertThat
(
code
,
containsString
(
"return a == 0 ? a : a;"
));
assertThat
(
code
,
containsLines
(
2
,
"if (a == 0) {"
,
"}"
,
"return a;"
));
}
@Test
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录