Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_39073359
jadx
提交
1533b7fe
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,体验更适合开发者的 AI 搜索 >>
未验证
提交
1533b7fe
编写于
6月 12, 2022
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: keep types on duplicate cast remove (#1527)
上级
a2cd8e1e
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
67 addition
and
5 deletion
+67
-5
jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java
...core/src/main/java/jadx/core/dex/visitors/ModVisitor.java
+15
-5
jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver21.java
...java/jadx/tests/integration/types/TestTypeResolver21.java
+29
-0
jadx-core/src/test/smali/types/TestTypeResolver21.smali
jadx-core/src/test/smali/types/TestTypeResolver21.smali
+23
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/visitors/ModVisitor.java
浏览文件 @
1533b7fe
...
...
@@ -362,8 +362,7 @@ public class ModVisitor extends AbstractVisitor {
private
static
void
removeCheckCast
(
MethodNode
mth
,
BlockNode
block
,
int
i
,
IndexInsnNode
insn
)
{
InsnArg
castArg
=
insn
.
getArg
(
0
);
ArgType
castType
=
(
ArgType
)
insn
.
getIndex
();
if
(!
ArgType
.
isCastNeeded
(
mth
.
root
(),
castArg
.
getType
(),
castType
)
||
isCastDuplicate
(
insn
))
{
if
(!
ArgType
.
isCastNeeded
(
mth
.
root
(),
castArg
.
getType
(),
castType
))
{
RegisterArg
result
=
insn
.
getResult
();
result
.
setType
(
castArg
.
getType
());
...
...
@@ -371,10 +370,19 @@ public class ModVisitor extends AbstractVisitor {
move
.
setResult
(
result
);
move
.
addArg
(
castArg
);
replaceInsn
(
mth
,
block
,
i
,
move
);
return
;
}
InsnNode
prevCast
=
isCastDuplicate
(
insn
);
if
(
prevCast
!=
null
)
{
// replace previous cast with move
InsnNode
move
=
new
InsnNode
(
InsnType
.
MOVE
,
1
);
move
.
setResult
(
prevCast
.
getResult
());
move
.
addArg
(
prevCast
.
getArg
(
0
));
replaceInsn
(
mth
,
block
,
prevCast
,
move
);
}
}
private
static
boolean
isCastDuplicate
(
IndexInsnNode
castInsn
)
{
private
static
@Nullable
InsnNode
isCastDuplicate
(
IndexInsnNode
castInsn
)
{
InsnArg
arg
=
castInsn
.
getArg
(
0
);
if
(
arg
.
isRegister
())
{
SSAVar
sVar
=
((
RegisterArg
)
arg
).
getSVar
();
...
...
@@ -382,11 +390,13 @@ public class ModVisitor extends AbstractVisitor {
InsnNode
assignInsn
=
sVar
.
getAssign
().
getParentInsn
();
if
(
assignInsn
!=
null
&&
assignInsn
.
getType
()
==
InsnType
.
CHECK_CAST
)
{
ArgType
assignCastType
=
(
ArgType
)
((
IndexInsnNode
)
assignInsn
).
getIndex
();
return
assignCastType
.
equals
(
castInsn
.
getIndex
());
if
(
assignCastType
.
equals
(
castInsn
.
getIndex
()))
{
return
assignInsn
;
}
}
}
}
return
false
;
return
null
;
}
/**
...
...
jadx-core/src/test/java/jadx/tests/integration/types/TestTypeResolver21.java
0 → 100644
浏览文件 @
1533b7fe
package
jadx.tests.integration.types
;
import
org.junit.jupiter.api.Test
;
import
jadx.tests.api.SmaliTest
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
/**
* Issue 1527
*/
@SuppressWarnings
(
"CommentedOutCode"
)
public
class
TestTypeResolver21
extends
SmaliTest
{
// @formatter:off
/*
public Number test(Object objectArray) {
Object[] arr = (Object[]) objectArray;
return (Number) arr[0];
}
*/
// @formatter:on
@Test
public
void
test
()
{
assertThat
(
getClassNodeFromSmali
())
.
code
()
.
containsOne
(
"Object[] arr = (Object[]) objectArray;"
);
}
}
jadx-core/src/test/smali/types/TestTypeResolver21.smali
0 → 100644
浏览文件 @
1533b7fe
.class public Ltypes/TestTypeResolver21;
.super Ljava/lang/Object;
.source "TestTypeResolver21.java"
.method public test(Ljava/lang/Object;)Ljava/lang/Number;
.registers 4
.param p1, "objectArray" # Ljava/lang/Object;
.prologue
.line 16
check-cast p1, [Ljava/lang/Object;
.end local p1 # "objectArray":Ljava/lang/Object;
move-object v0, p1
check-cast v0, [Ljava/lang/Object;
.line 17
.local v0, "arr":[Ljava/lang/Object;
const/4 v1, 0x0
aget-object v1, v0, v1
check-cast v1, Ljava/lang/Number;
return-object v1
.end method
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录