4

目前我正在从事一个处理字节码分析的项目。我遇到了代码,

char[] buff = new char[1];
//some code tainting the buff   
return (new String(buff));

在字节码中我发现相关的映射new String(buff)

Ljava/lang/StringValue.cache

你们中的任何人都可以解释这个cache领域从哪里来的场景吗?


它来自 jdk i.6, StringValue。根据描述,“这个类完全由静态方法组成,这些方法对字符串用于存储值的字符数组进行操作。”

任何人都可以对此有所了解吗?它的实际目的是什么?我认为这主要是因为他们使用的字符缓冲区作为参数传递给字符串。这个类并没有修改缓冲区的内容,而是我认为它只是一个网关来说明缓冲区的内容仅用于初始化一个字符串。

4

2 回答 2

2

这应该是不可能的。这是您发布的序列在最近的 Javac 编译后的样子。

iconst_1
newarray char
astore_1
new java/lang/String
dup
aload_1
invokespecial java/lang/String <init> ([C)V
areturn

此外,java/lang/StringValue至少在 jre1.7.0_17 中甚至不存在。此外,句点的存在表明它可能是 Jasmin 合并的类/方法标记之一,在这种情况下,它实际上是指Ljava包中的一个类,无论它应该是什么。

有两种主要可能性——编译器损坏或反汇编器损坏。如果您在此处发布类文件,我们至少可以弄清楚是哪种情况。

于 2013-04-15T12:14:24.807 回答
0

如果已经存在具有相同内容的字符串,那么它显然是一种返回缓存字符串的方法。实际上就像 String.intern() 一样。

于 2013-04-15T23:21:00.667 回答