Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
ql04210214
jadx
提交
f37c23db
J
jadx
项目概览
ql04210214
/
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
f37c23db
编写于
12月 13, 2021
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: use correct top block for try blocks with same start (#1304)
上级
d2bde0be
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
85 addition
and
15 deletion
+85
-15
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java
.../jadx/core/dex/visitors/blocks/BlockExceptionHandler.java
+25
-11
jadx-core/src/main/java/jadx/core/utils/BlockUtils.java
jadx-core/src/main/java/jadx/core/utils/BlockUtils.java
+4
-4
jadx-core/src/main/java/jadx/core/utils/DebugUtils.java
jadx-core/src/main/java/jadx/core/utils/DebugUtils.java
+4
-0
jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally13.java
...adx/tests/integration/trycatch/TestTryCatchFinally13.java
+52
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java
浏览文件 @
f37c23db
...
...
@@ -323,23 +323,14 @@ public class BlockExceptionHandler {
private
static
boolean
wrapBlocksWithTryCatch
(
MethodNode
mth
,
TryCatchBlockAttr
tryCatchBlock
)
{
List
<
BlockNode
>
blocks
=
tryCatchBlock
.
getBlocks
();
BlockNode
top
=
searchTopBlock
(
mth
,
blocks
);
if
(
top
.
getPredecessors
().
isEmpty
())
{
if
(
top
.
getPredecessors
().
isEmpty
()
&&
top
!=
mth
.
getEnterBlock
()
)
{
return
false
;
}
BlockNode
bottom
=
searchBottomBlock
(
mth
,
blocks
);
if
(
Consts
.
DEBUG_EXC_HANDLERS
)
{
LOG
.
debug
(
"TryCatch #{} split: top {}, bottom: {}"
,
tryCatchBlock
.
id
(),
top
,
bottom
);
}
BlockNode
topSplitterBlock
;
if
(
top
==
mth
.
getEnterBlock
())
{
BlockNode
fixedTop
=
mth
.
getEnterBlock
().
getSuccessors
().
get
(
0
);
topSplitterBlock
=
BlockSplitter
.
blockSplitTop
(
mth
,
fixedTop
);
}
else
{
BlockNode
existTopSplitter
=
BlockUtils
.
getBlockWithFlag
(
top
.
getPredecessors
(),
AFlag
.
EXC_TOP_SPLITTER
);
topSplitterBlock
=
existTopSplitter
!=
null
?
existTopSplitter
:
BlockSplitter
.
blockSplitTop
(
mth
,
top
);
}
BlockNode
topSplitterBlock
=
getTopSplitterBlock
(
mth
,
top
);
topSplitterBlock
.
add
(
AFlag
.
EXC_TOP_SPLITTER
);
topSplitterBlock
.
add
(
AFlag
.
SYNTHETIC
);
...
...
@@ -356,6 +347,10 @@ public class BlockExceptionHandler {
BlockSplitter
.
connect
(
bottom
,
bottomSplitterBlock
);
}
if
(
Consts
.
DEBUG_EXC_HANDLERS
)
{
LOG
.
debug
(
"TryCatch #{} result splitters: top {}, bottom: {}"
,
tryCatchBlock
.
id
(),
topSplitterBlock
,
bottomSplitterBlock
);
}
connectSplittersAndHandlers
(
tryCatchBlock
,
topSplitterBlock
,
bottomSplitterBlock
);
for
(
BlockNode
block
:
blocks
)
{
...
...
@@ -373,6 +368,25 @@ public class BlockExceptionHandler {
return
true
;
}
private
static
BlockNode
getTopSplitterBlock
(
MethodNode
mth
,
BlockNode
top
)
{
if
(
top
==
mth
.
getEnterBlock
())
{
BlockNode
fixedTop
=
mth
.
getEnterBlock
().
getSuccessors
().
get
(
0
);
return
BlockSplitter
.
blockSplitTop
(
mth
,
fixedTop
);
}
BlockNode
existPredTopSplitter
=
BlockUtils
.
getBlockWithFlag
(
top
.
getPredecessors
(),
AFlag
.
EXC_TOP_SPLITTER
);
if
(
existPredTopSplitter
!=
null
)
{
return
existPredTopSplitter
;
}
// try to reuse exists splitter on empty simple path below top block
if
(
top
.
getCleanSuccessors
().
size
()
==
1
&&
top
.
getInstructions
().
isEmpty
())
{
BlockNode
otherTopSplitter
=
BlockUtils
.
getBlockWithFlag
(
top
.
getCleanSuccessors
(),
AFlag
.
EXC_TOP_SPLITTER
);
if
(
otherTopSplitter
!=
null
&&
otherTopSplitter
.
getPredecessors
().
size
()
==
1
)
{
return
otherTopSplitter
;
}
}
return
BlockSplitter
.
blockSplitTop
(
mth
,
top
);
}
private
static
BlockNode
searchTopBlock
(
MethodNode
mth
,
List
<
BlockNode
>
blocks
)
{
BlockNode
top
=
BlockUtils
.
getTopBlock
(
blocks
);
if
(
top
!=
null
)
{
...
...
jadx-core/src/main/java/jadx/core/utils/BlockUtils.java
浏览文件 @
f37c23db
...
...
@@ -572,9 +572,9 @@ public class BlockUtils {
return
traverseSuccessorsUntil
(
start
,
end
,
new
BitSet
(),
false
);
}
public
static
BlockNode
getTopBlock
(
Collection
<
BlockNode
>
blocks
)
{
public
static
BlockNode
getTopBlock
(
List
<
BlockNode
>
blocks
)
{
if
(
blocks
.
size
()
==
1
)
{
return
blocks
.
iterator
().
next
(
);
return
blocks
.
get
(
0
);
}
for
(
BlockNode
from
:
blocks
)
{
boolean
top
=
true
;
...
...
@@ -594,9 +594,9 @@ public class BlockUtils {
/**
* Search last block in control flow graph from input set.
*/
public
static
BlockNode
getBottomBlock
(
Collection
<
BlockNode
>
blocks
)
{
public
static
BlockNode
getBottomBlock
(
List
<
BlockNode
>
blocks
)
{
if
(
blocks
.
size
()
==
1
)
{
return
blocks
.
iterator
().
next
(
);
return
blocks
.
get
(
0
);
}
for
(
BlockNode
bottomCandidate
:
blocks
)
{
boolean
bottom
=
true
;
...
...
jadx-core/src/main/java/jadx/core/utils/DebugUtils.java
浏览文件 @
f37c23db
...
...
@@ -59,6 +59,10 @@ public class DebugUtils {
}
}
public
static
void
dumpRawTest
(
MethodNode
mth
,
String
desc
)
{
dumpRaw
(
mth
,
desc
,
method
->
method
.
getName
().
equals
(
"test"
));
}
public
static
void
dumpRaw
(
MethodNode
mth
,
String
desc
)
{
File
out
=
new
File
(
"test-graph-"
+
desc
+
"-tmp"
);
DotGraphVisitor
.
dumpRaw
().
save
(
out
,
mth
);
...
...
jadx-core/src/test/java/jadx/tests/integration/trycatch/TestTryCatchFinally13.java
0 → 100644
浏览文件 @
f37c23db
package
jadx.tests.integration.trycatch
;
import
jadx.tests.api.IntegrationTest
;
import
jadx.tests.api.extensions.inputs.InputPlugin
;
import
jadx.tests.api.extensions.inputs.TestWithInputPlugins
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestTryCatchFinally13
extends
IntegrationTest
{
public
static
class
TestCls
{
public
void
test
(
int
i
)
{
try
{
doSomething1
();
if
(
i
==
-
12
)
{
return
;
}
if
(
i
>
10
)
{
doSomething2
();
}
else
if
(
i
==
-
1
)
{
doSomething3
();
}
}
catch
(
Exception
ex
)
{
logError
();
}
finally
{
doSomething4
();
}
}
private
void
logError
()
{
}
private
void
doSomething1
()
{
}
private
void
doSomething2
()
{
}
private
void
doSomething3
()
{
}
private
void
doSomething4
()
{
}
}
@TestWithInputPlugins
({
InputPlugin
.
DEX
,
InputPlugin
.
JAVA
})
public
void
test
()
{
assertThat
(
getClassNode
(
TestCls
.
class
))
.
code
()
.
containsOne
(
"} finally {"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录