Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
keyescgm
jadx
提交
e7598d43
J
jadx
项目概览
keyescgm
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
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,发现更多精彩内容 >>
提交
e7598d43
编写于
12月 03, 2020
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: don't add region on exit block (#1040)
上级
76d0a39a
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
97 addition
and
0 deletion
+97
-0
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
...main/java/jadx/core/dex/visitors/regions/RegionMaker.java
+26
-0
jadx-core/src/test/java/jadx/tests/integration/trycatch/TestLoopInTryCatch.java
...a/jadx/tests/integration/trycatch/TestLoopInTryCatch.java
+29
-0
jadx-core/src/test/smali/trycatch/TestLoopInTryCatch.smali
jadx-core/src/test/smali/trycatch/TestLoopInTryCatch.smali
+42
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
浏览文件 @
e7598d43
...
...
@@ -30,6 +30,7 @@ import jadx.core.dex.nodes.Edge;
import
jadx.core.dex.nodes.IBlock
;
import
jadx.core.dex.nodes.IContainer
;
import
jadx.core.dex.nodes.IRegion
;
import
jadx.core.dex.nodes.InsnContainer
;
import
jadx.core.dex.nodes.InsnNode
;
import
jadx.core.dex.nodes.MethodNode
;
import
jadx.core.dex.regions.Region
;
...
...
@@ -76,6 +77,10 @@ public class RegionMaker {
if
(
startBlock
==
null
)
{
return
r
;
}
if
(
stack
.
containsExit
(
startBlock
))
{
insertEdgeInsns
(
r
,
startBlock
);
return
r
;
}
int
startBlockId
=
startBlock
.
getId
();
if
(
processedBlocks
.
get
(
startBlockId
))
{
...
...
@@ -95,6 +100,27 @@ public class RegionMaker {
return
r
;
}
private
void
insertEdgeInsns
(
Region
region
,
BlockNode
exitBlock
)
{
List
<
EdgeInsnAttr
>
edgeInsns
=
exitBlock
.
getAll
(
AType
.
EDGE_INSN
);
if
(
edgeInsns
.
isEmpty
())
{
return
;
}
List
<
InsnNode
>
insns
=
new
ArrayList
<>(
edgeInsns
.
size
());
addOneInsnOfType
(
insns
,
edgeInsns
,
InsnType
.
BREAK
);
addOneInsnOfType
(
insns
,
edgeInsns
,
InsnType
.
CONTINUE
);
region
.
add
(
new
InsnContainer
(
insns
));
}
private
void
addOneInsnOfType
(
List
<
InsnNode
>
insns
,
List
<
EdgeInsnAttr
>
edgeInsns
,
InsnType
insnType
)
{
for
(
EdgeInsnAttr
edgeInsn
:
edgeInsns
)
{
InsnNode
insn
=
edgeInsn
.
getInsn
();
if
(
insn
.
getType
()
==
insnType
)
{
insns
.
add
(
insn
);
return
;
}
}
}
/**
* Recursively traverse all blocks from 'block' until block from 'exits'
*/
...
...
jadx-core/src/test/java/jadx/tests/integration/trycatch/TestLoopInTryCatch.java
0 → 100644
浏览文件 @
e7598d43
package
jadx.tests.integration.trycatch
;
import
org.junit.jupiter.api.Test
;
import
jadx.tests.api.SmaliTest
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestLoopInTryCatch
extends
SmaliTest
{
@Test
public
void
test
()
{
assertThat
(
getClassNodeFromSmali
())
.
code
()
.
containsLines
(
2
,
"int i;"
,
"while (true) {"
,
" try {"
,
" i = getI();"
,
" } catch (RuntimeException unused) {"
,
" return;"
,
" }"
,
" if (i == 1 || i == 2) {"
,
" break;"
,
" }"
,
"}"
,
"if (i == 1) {"
,
"}"
);
}
}
jadx-core/src/test/smali/trycatch/TestLoopInTryCatch.smali
0 → 100644
浏览文件 @
e7598d43
.class public Ltrycatch/TestLoopInTryCatch;
.super Ljava/lang/Object;
.source "SourceFile"
.method public static test()V
.registers 6
:try_start
:loop
invoke-static {}, Ltrycatch/TestLoopInTryCatch;->getI()I
move-result v1
const/4 v2, 0x1
if-eq v1, v2, :cond
const/4 v3, 0x2
if-eq v1, v3, :cond
goto :loop
:cond
if-eq v1, v2, :end
return-void
:try_end
.catch Ljava/lang/RuntimeException; {:try_start .. :try_end} :end
:end
return-void
.end method
.method public static getI()I
.locals 2
const/4 v1, 0x1
return v1
.end method
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录