Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
keyescgm
jadx
提交
0f808d5c
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,发现更多精彩内容 >>
提交
0f808d5c
编写于
7月 20, 2020
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: resolve char literal incorrect print as string (#856)
上级
f5767dd8
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
89 addition
and
47 deletion
+89
-47
jadx-core/src/main/java/jadx/core/Consts.java
jadx-core/src/main/java/jadx/core/Consts.java
+1
-0
jadx-core/src/main/java/jadx/core/codegen/TypeGen.java
jadx-core/src/main/java/jadx/core/codegen/TypeGen.java
+1
-6
jadx-core/src/main/java/jadx/core/dex/visitors/MethodInvokeVisitor.java
...main/java/jadx/core/dex/visitors/MethodInvokeVisitor.java
+8
-7
jadx-core/src/main/java/jadx/core/utils/StringUtils.java
jadx-core/src/main/java/jadx/core/utils/StringUtils.java
+52
-32
jadx-core/src/test/java/jadx/tests/functional/StringUtilsTest.java
.../src/test/java/jadx/tests/functional/StringUtilsTest.java
+3
-2
jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke4.java
...tests/integration/invoke/TestCastInOverloadedInvoke4.java
+24
-0
未找到文件。
jadx-core/src/main/java/jadx/core/Consts.java
浏览文件 @
0f808d5c
...
...
@@ -4,6 +4,7 @@ public class Consts {
public
static
final
boolean
DEBUG
=
false
;
public
static
final
boolean
DEBUG_USAGE
=
false
;
public
static
final
boolean
DEBUG_TYPE_INFERENCE
=
false
;
public
static
final
boolean
DEBUG_OVERLOADED_CASTS
=
false
;
public
static
final
String
CLASS_OBJECT
=
"java.lang.Object"
;
public
static
final
String
CLASS_STRING
=
"java.lang.String"
;
...
...
jadx-core/src/main/java/jadx/core/codegen/TypeGen.java
浏览文件 @
0f808d5c
...
...
@@ -3,7 +3,6 @@ package jadx.core.codegen;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
jadx.core.deobf.NameMapper
;
import
jadx.core.dex.attributes.AFlag
;
import
jadx.core.dex.instructions.args.ArgType
;
import
jadx.core.dex.instructions.args.LiteralArg
;
...
...
@@ -71,11 +70,7 @@ public class TypeGen {
case
BOOLEAN:
return
lit
==
0
?
"false"
:
"true"
;
case
CHAR:
char
ch
=
(
char
)
lit
;
if
(!
NameMapper
.
isPrintableChar
(
ch
))
{
return
Integer
.
toString
(
ch
);
}
return
stringUtils
.
unescapeChar
(
ch
);
return
stringUtils
.
unescapeChar
((
char
)
lit
,
cast
);
case
BYTE:
return
formatByte
(
lit
,
cast
);
case
SHORT:
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/MethodInvokeVisitor.java
浏览文件 @
0f808d5c
...
...
@@ -278,13 +278,14 @@ public class MethodInvokeVisitor extends AbstractVisitor {
if
(
argsCount
==
1
)
{
return
mthDetails
.
getArgTypes
();
}
// TODO: try to minimize casts count
parentMth
.
addComment
(
"JADX DEBUG: Failed to find minimal casts for resolve overloaded methods, cast all args instead"
+
NL
+
" method: "
+
mthDetails
+
NL
+
" arg types: "
+
compilerVarTypes
+
NL
+
" candidates:"
+
NL
+
" "
+
Utils
.
listToString
(
overloadedMethods
,
NL
+
" "
));
if
(
Consts
.
DEBUG_OVERLOADED_CASTS
)
{
// TODO: try to minimize casts count
parentMth
.
addComment
(
"JADX DEBUG: Failed to find minimal casts for resolve overloaded methods, cast all args instead"
+
NL
+
" method: "
+
mthDetails
+
NL
+
" arg types: "
+
compilerVarTypes
+
NL
+
" candidates:"
+
NL
+
" "
+
Utils
.
listToString
(
overloadedMethods
,
NL
+
" "
));
}
// not resolved -> cast all args
return
mthDetails
.
getArgTypes
();
}
...
...
jadx-core/src/main/java/jadx/core/utils/StringUtils.java
浏览文件 @
0f808d5c
package
jadx.core.utils
;
import
org.jetbrains.annotations.Nullable
;
import
jadx.api.JadxArgs
;
import
jadx.core.deobf.NameMapper
;
public
class
StringUtils
{
private
static
final
StringUtils
DEFAULT_INSTANCE
=
new
StringUtils
(
new
JadxArgs
());
...
...
@@ -24,57 +27,74 @@ public class StringUtils {
res
.
append
(
'"'
);
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
int
c
=
str
.
charAt
(
i
)
&
0xFFFF
;
processChar
(
c
,
res
);
processChar
InsideString
(
c
,
res
);
}
res
.
append
(
'"'
);
return
res
.
toString
();
}
public
String
unescapeChar
(
char
ch
)
{
if
(
ch
==
'\''
)
{
return
"'\\\''"
;
private
void
processCharInsideString
(
int
c
,
StringBuilder
res
)
{
String
str
=
getSpecialStringForChar
(
c
);
if
(
str
!=
null
)
{
res
.
append
(
str
);
return
;
}
if
(
c
<
32
||
c
>=
127
&&
escapeUnicode
)
{
res
.
append
(
"\\u"
).
append
(
String
.
format
(
"%04x"
,
c
));
}
else
{
res
.
append
((
char
)
c
);
}
StringBuilder
res
=
new
StringBuilder
();
res
.
append
(
'\''
);
processChar
(
ch
,
res
);
res
.
append
(
'\''
);
return
res
.
toString
();
}
private
void
processChar
(
int
c
,
StringBuilder
res
)
{
/**
* Represent single char best way possible
*/
public
String
unescapeChar
(
int
c
,
boolean
explicitCast
)
{
if
(
c
==
'\''
)
{
return
"'\\''"
;
}
String
str
=
getSpecialStringForChar
(
c
);
if
(
str
!=
null
)
{
return
'\''
+
str
+
'\''
;
}
if
(
c
>=
127
&&
escapeUnicode
)
{
return
String
.
format
(
"'\\u%04x'"
,
c
);
}
if
(
NameMapper
.
isPrintableChar
(
c
))
{
return
"'"
+
(
char
)
c
+
'\''
;
}
if
(
explicitCast
)
{
return
"(char) "
+
c
;
}
return
String
.
valueOf
(
c
);
}
public
String
unescapeChar
(
char
ch
)
{
return
unescapeChar
(
ch
,
false
);
}
@Nullable
private
String
getSpecialStringForChar
(
int
c
)
{
switch
(
c
)
{
case
'\n'
:
res
.
append
(
"\\n"
);
break
;
return
"\\n"
;
case
'\r'
:
res
.
append
(
"\\r"
);
break
;
return
"\\r"
;
case
'\t'
:
res
.
append
(
"\\t"
);
break
;
return
"\\t"
;
case
'\b'
:
res
.
append
(
"\\b"
);
break
;
return
"\\b"
;
case
'\f'
:
res
.
append
(
"\\f"
);
break
;
return
"\\f"
;
case
'\''
:
res
.
append
(
'\''
);
break
;
return
"'"
;
case
'"'
:
res
.
append
(
"\\\""
);
break
;
return
"\\\""
;
case
'\\'
:
res
.
append
(
"\\\\"
);
break
;
return
"\\\\"
;
default
:
if
(
c
<
32
||
c
>=
127
&&
escapeUnicode
)
{
res
.
append
(
"\\u"
).
append
(
String
.
format
(
"%04x"
,
c
));
}
else
{
res
.
append
((
char
)
c
);
}
break
;
return
null
;
}
}
...
...
jadx-core/src/test/java/jadx/tests/functional/StringUtilsTest.java
浏览文件 @
0f808d5c
...
...
@@ -43,8 +43,9 @@ class StringUtilsTest {
checkCharUnescape
(
'a'
,
"a"
);
checkCharUnescape
(
' '
,
" "
);
checkCharUnescape
(
'\n'
,
"\\n"
);
checkCharUnescape
(
'\''
,
"\\\'"
);
checkCharUnescape
(
'\0'
,
"\\u0000"
);
checkCharUnescape
(
'\''
,
"\\'"
);
assertThat
(
stringUtils
.
unescapeChar
(
'\0'
),
is
(
"0"
));
}
private
void
checkCharUnescape
(
char
input
,
String
result
)
{
...
...
jadx-core/src/test/java/jadx/tests/integration/invoke/TestCastInOverloadedInvoke4.java
0 → 100644
浏览文件 @
0f808d5c
package
jadx.tests.integration.invoke
;
import
org.junit.jupiter.api.Test
;
import
jadx.tests.api.IntegrationTest
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestCastInOverloadedInvoke4
extends
IntegrationTest
{
public
static
class
TestCls
{
public
String
test
(
String
str
)
{
return
str
.
replace
(
'\n'
,
' '
);
}
}
@Test
public
void
test
()
{
noDebugInfo
();
assertThat
(
getClassNode
(
TestCls
.
class
))
.
code
()
.
containsOne
(
"return str.replace('\\n', ' ');"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录