Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_39073359
jadx
提交
f366eac7
J
jadx
项目概览
qq_39073359
/
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,发现更多精彩内容 >>
提交
f366eac7
编写于
3月 01, 2015
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
core: fix switch in loop (fix #52)
上级
46d3992b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
55 addition
and
6 deletion
+55
-6
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
...main/java/jadx/core/dex/visitors/regions/RegionMaker.java
+11
-6
jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchInLoop.java
...ava/jadx/tests/integration/switches/TestSwitchInLoop.java
+44
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMaker.java
浏览文件 @
f366eac7
...
@@ -663,7 +663,8 @@ public class RegionMaker {
...
@@ -663,7 +663,8 @@ public class RegionMaker {
Map
<
BlockNode
,
BlockNode
>
fallThroughCases
=
new
LinkedHashMap
<
BlockNode
,
BlockNode
>();
Map
<
BlockNode
,
BlockNode
>
fallThroughCases
=
new
LinkedHashMap
<
BlockNode
,
BlockNode
>();
BitSet
outs
=
new
BitSet
(
mth
.
getBasicBlocks
().
size
());
List
<
BlockNode
>
basicBlocks
=
mth
.
getBasicBlocks
();
BitSet
outs
=
new
BitSet
(
basicBlocks
.
size
());
outs
.
or
(
block
.
getDomFrontier
());
outs
.
or
(
block
.
getDomFrontier
());
for
(
BlockNode
s
:
block
.
getCleanSuccessors
())
{
for
(
BlockNode
s
:
block
.
getCleanSuccessors
())
{
BitSet
df
=
s
.
getDomFrontier
();
BitSet
df
=
s
.
getDomFrontier
();
...
@@ -672,8 +673,8 @@ public class RegionMaker {
...
@@ -672,8 +673,8 @@ public class RegionMaker {
if
(
df
.
cardinality
()
>
2
)
{
if
(
df
.
cardinality
()
>
2
)
{
LOG
.
debug
(
"Unexpected case pattern, block: {}, mth: {}"
,
s
,
mth
);
LOG
.
debug
(
"Unexpected case pattern, block: {}, mth: {}"
,
s
,
mth
);
}
else
{
}
else
{
BlockNode
first
=
mth
.
getBasicBlocks
()
.
get
(
df
.
nextSetBit
(
0
));
BlockNode
first
=
basicBlocks
.
get
(
df
.
nextSetBit
(
0
));
BlockNode
second
=
mth
.
getBasicBlocks
()
.
get
(
df
.
nextSetBit
(
first
.
getId
()
+
1
));
BlockNode
second
=
basicBlocks
.
get
(
df
.
nextSetBit
(
first
.
getId
()
+
1
));
if
(
second
.
getDomFrontier
().
get
(
first
.
getId
()))
{
if
(
second
.
getDomFrontier
().
get
(
first
.
getId
()))
{
fallThroughCases
.
put
(
s
,
second
);
fallThroughCases
.
put
(
s
,
second
);
df
=
new
BitSet
(
df
.
size
());
df
=
new
BitSet
(
df
.
size
());
...
@@ -687,6 +688,11 @@ public class RegionMaker {
...
@@ -687,6 +688,11 @@ public class RegionMaker {
}
}
outs
.
or
(
df
);
outs
.
or
(
df
);
}
}
outs
.
clear
(
block
.
getId
());
if
(
loop
!=
null
)
{
outs
.
clear
(
loop
.
getStart
().
getId
());
}
stack
.
push
(
sw
);
stack
.
push
(
sw
);
stack
.
addExits
(
BlockUtils
.
bitSetToBlocks
(
mth
,
outs
));
stack
.
addExits
(
BlockUtils
.
bitSetToBlocks
(
mth
,
outs
));
...
@@ -709,9 +715,8 @@ public class RegionMaker {
...
@@ -709,9 +715,8 @@ public class RegionMaker {
}
}
if
(
outs
.
cardinality
()
>
1
)
{
if
(
outs
.
cardinality
()
>
1
)
{
// filter loop start and successors of other blocks
// filter loop start and successors of other blocks
List
<
BlockNode
>
blocks
=
mth
.
getBasicBlocks
();
for
(
int
i
=
outs
.
nextSetBit
(
0
);
i
>=
0
;
i
=
outs
.
nextSetBit
(
i
+
1
))
{
for
(
int
i
=
outs
.
nextSetBit
(
0
);
i
>=
0
;
i
=
outs
.
nextSetBit
(
i
+
1
))
{
BlockNode
b
=
blocks
.
get
(
i
);
BlockNode
b
=
b
asicB
locks
.
get
(
i
);
outs
.
andNot
(
b
.
getDomFrontier
());
outs
.
andNot
(
b
.
getDomFrontier
());
if
(
b
.
contains
(
AFlag
.
LOOP_START
))
{
if
(
b
.
contains
(
AFlag
.
LOOP_START
))
{
outs
.
clear
(
b
.
getId
());
outs
.
clear
(
b
.
getId
());
...
@@ -745,7 +750,7 @@ public class RegionMaker {
...
@@ -745,7 +750,7 @@ public class RegionMaker {
}
}
BlockNode
out
=
null
;
BlockNode
out
=
null
;
if
(
outs
.
cardinality
()
==
1
)
{
if
(
outs
.
cardinality
()
==
1
)
{
out
=
mth
.
getBasicBlocks
()
.
get
(
outs
.
nextSetBit
(
0
));
out
=
basicBlocks
.
get
(
outs
.
nextSetBit
(
0
));
stack
.
addExit
(
out
);
stack
.
addExit
(
out
);
}
else
if
(
loop
==
null
&&
outs
.
cardinality
()
>
1
)
{
}
else
if
(
loop
==
null
&&
outs
.
cardinality
()
>
1
)
{
LOG
.
warn
(
"Can't detect out node for switch block: {} in {}"
,
block
,
mth
);
LOG
.
warn
(
"Can't detect out node for switch block: {} in {}"
,
block
,
mth
);
...
...
jadx-core/src/test/java/jadx/tests/integration/switches/TestSwitchInLoop.java
0 → 100644
浏览文件 @
f366eac7
package
jadx.tests.integration.switches
;
import
jadx.core.dex.nodes.ClassNode
;
import
jadx.tests.api.IntegrationTest
;
import
org.junit.Test
;
import
static
jadx
.
tests
.
api
.
utils
.
JadxMatchers
.
containsOne
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
import
static
org
.
junit
.
Assert
.
assertThat
;
public
class
TestSwitchInLoop
extends
IntegrationTest
{
public
static
class
TestCls
{
public
int
test
(
int
k
)
{
int
a
=
0
;
while
(
true
)
{
switch
(
k
)
{
case
0
:
return
a
;
default
:
a
++;
k
>>=
1
;
}
}
}
public
void
check
()
{
assertEquals
(
1
,
test
(
1
));
}
}
@Test
public
void
test
()
{
ClassNode
cls
=
getClassNode
(
TestCls
.
class
);
String
code
=
cls
.
getCode
().
toString
();
assertThat
(
code
,
containsOne
(
"switch (k) {"
));
assertThat
(
code
,
containsOne
(
"case 0:"
));
assertThat
(
code
,
containsOne
(
"return a;"
));
assertThat
(
code
,
containsOne
(
"default:"
));
assertThat
(
code
,
containsOne
(
"a++;"
));
assertThat
(
code
,
containsOne
(
"k >>= 1;"
));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录