目前我正在开发一个处理字节码分析的项目。我遇到了代码,
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。根据描述,“此类仅包含对字符串数组运行的静态方法,用于存储值。”
任何人都可以对此有所了解吗?实际上它的目的是什么?我认为这主要是因为他们使用的字符缓冲区作为争论传递给字符串。这个类不是修改缓冲区的内容,而是我认为它只是一个网关来说明缓冲区的内容仅用于初始化字符串。
答案 0 :(得分: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
包中的一个类,无论应该是什么类。
有两种主要可能性 - 破坏的编译器或破坏的反汇编程序。如果您在此处发布类文件,我们至少可以找出其中的哪一个。
答案 1 :(得分:0)
显然,如果已存在具有相同内容的字符串,则返回缓存的字符串。就像String.intern()一样。
答案 2 :(得分:0)
字节码是Java程序的中间表示,就像汇编程序是C或C ++程序的中间表示一样。最知识渊博的C和C ++程序员知道他们正在编译的处理器的汇编指令集。在调试和执行性能和内存使用调整时,这些知识至关重要。了解编译器为您编写的源代码生成的汇编程序指令,可帮助您了解如何以不同方式编写代码以实现内存或性能目标。此外,在追踪问题时,使用调试器来反汇编源代码并逐步执行正在执行的汇编程序代码通常很有用。