Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
colcode
jadx
提交
5a24eac3
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,发现更多精彩内容 >>
提交
5a24eac3
编写于
7月 04, 2015
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
core: fix exit node search for synchronized block (fix #72)
上级
a684118d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
62 addition
and
6 deletion
+62
-6
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
...main/java/jadx/core/dex/visitors/regions/RegionMaker.java
+19
-6
jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized3.java
...jadx/tests/integration/synchronize/TestSynchronized3.java
+43
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
浏览文件 @
5a24eac3
...
...
@@ -504,18 +504,21 @@ public class RegionMaker {
return
true
;
}
private
final
Set
<
BlockNode
>
cacheSet
=
new
HashSet
<
BlockNode
>();
private
BlockNode
processMonitorEnter
(
IRegion
curRegion
,
BlockNode
block
,
InsnNode
insn
,
RegionStack
stack
)
{
SynchronizedRegion
synchRegion
=
new
SynchronizedRegion
(
curRegion
,
insn
);
synchRegion
.
getSubBlocks
().
add
(
block
);
curRegion
.
getSubBlocks
().
add
(
synchRegion
);
Set
<
BlockNode
>
exits
=
new
HashSet
<
BlockNode
>();
cacheSet
.
clear
();
Set
<
BlockNode
>
cacheSet
=
new
HashSet
<
BlockNode
>
();
traverseMonitorExits
(
synchRegion
,
insn
.
getArg
(
0
),
block
,
exits
,
cacheSet
);
for
(
InsnNode
exitInsn
:
synchRegion
.
getExitInsns
())
{
BlockNode
insnBlock
=
BlockUtils
.
getBlockByInsn
(
mth
,
exitInsn
);
if
(
insnBlock
!=
null
)
{
insnBlock
.
add
(
AFlag
.
SKIP
);
}
exitInsn
.
add
(
AFlag
.
SKIP
);
InstructionRemover
.
unbindInsn
(
mth
,
exitInsn
);
}
...
...
@@ -524,16 +527,26 @@ public class RegionMaker {
ErrorsCounter
.
methodError
(
mth
,
"Unexpected end of synchronized block"
);
return
null
;
}
BlockNode
exit
;
BlockNode
exit
=
null
;
if
(
exits
.
size
()
==
1
)
{
exit
=
getNextBlock
(
exits
.
iterator
().
next
());
}
else
{
}
else
if
(
exits
.
size
()
>
1
)
{
cacheSet
.
clear
();
exit
=
traverseMonitorExitsCross
(
body
,
exits
,
cacheSet
);
}
stack
.
push
(
synchRegion
);
stack
.
addExit
(
exit
);
if
(
exit
!=
null
)
{
stack
.
addExit
(
exit
);
}
else
{
for
(
BlockNode
exitBlock
:
exits
)
{
// don't add exit blocks which leads to method end blocks ('return', 'throw', etc)
List
<
BlockNode
>
list
=
BlockUtils
.
buildSimplePath
(
exitBlock
);
if
(
list
.
isEmpty
()
||
!
list
.
get
(
list
.
size
()
-
1
).
getSuccessors
().
isEmpty
())
{
stack
.
addExit
(
exitBlock
);
}
}
}
synchRegion
.
getSubBlocks
().
add
(
makeRegion
(
body
,
stack
));
stack
.
pop
();
return
exit
;
...
...
jadx-core/src/test/java/jadx/tests/integration/synchronize/TestSynchronized3.java
0 → 100644
浏览文件 @
5a24eac3
package
jadx.tests.integration.synchronize
;
import
jadx.core.dex.nodes.ClassNode
;
import
jadx.tests.api.IntegrationTest
;
import
org.junit.Test
;
import
static
jadx
.
tests
.
api
.
utils
.
JadxMatchers
.
containsLines
;
import
static
org
.
junit
.
Assert
.
assertThat
;
public
class
TestSynchronized3
extends
IntegrationTest
{
public
static
class
TestCls
{
private
int
x
;
public
void
f
()
{
}
public
void
test
()
{
while
(
true
)
{
synchronized
(
this
)
{
if
(
x
==
0
)
{
throw
new
IllegalStateException
(
"bad luck"
);
}
x
++;
if
(
x
==
10
)
{
break
;
}
}
this
.
x
++;
f
();
}
}
}
@Test
public
void
test
()
{
ClassNode
cls
=
getClassNode
(
TestCls
.
class
);
String
code
=
cls
.
getCode
().
toString
();
assertThat
(
code
,
containsLines
(
3
,
"}"
,
"this.x++;"
,
"f();"
));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录