2013-04-15 86 views
4

目前我正在處理一個處理字節碼分析的項目。我在字節碼我發現new String(buff)相關映射遇到的代碼,java字節碼類定義

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

Ljava/lang/StringValue.cache 

可你們的人從那裏這個cache領域涉及到的情況解釋一下嗎?


它來自jdk i.6,StringValue。根據描述,「這個類完全由靜態方法組成,這些方法對字符串用於存儲值的字符數組進行操作。」

任何人都可以對此有所瞭解嗎?它的目的究竟是什麼?我認爲這主要是因爲他們使用的字符緩衝區被作爲參數傳遞給字符串。這個類沒有修改緩衝區的內容,相反,我認爲這只是一個網關來說明緩衝區的內容僅用於初始化一個字符串。

+2

用什麼編譯器?我沒有看到JDK 7. – EJP

+0

我的編譯器是,jdk 1.6 –

+0

你使用什麼樣的編譯器?它是gcj嗎? – caoxudong

回答

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包中的類,不管該應用是什麼。

有兩種主要的可能性 - 破碎的編譯器或破碎的反彙編程序。如果你在這裏發佈類文件,我們至少可以弄清楚哪些是這種情況。

0

這顯然是一種方法,如果已經存在相同的內容,則返回緩存的字符串。實際上就像String.intern()一樣。

0

Bytecode是Java程序的中間表示,就像彙編程序是C或C++程序的中間表示一樣。大多數知識淵博的C和C++程序員都知道他們正在編譯的處理器的彙編指令集。在調試和執行性能和內存使用調優時,這些知識至關重要。瞭解編譯器針對您編寫的源代碼生成的彙編程序指令,可幫助您瞭解如何通過不同的代碼實現內存或性能目標。此外,在追蹤問題時,使用調試器反彙編源代碼並逐步執行正在執行的彙編代碼通常很有用。