2010-12-04 33 views
5

有沒有一種工具可以使我的c代碼溢出?在c代碼中顯示溢出的工具

我的意思是看看代碼塊有可能使寄存器移動到內存。

編輯:什麼是泄漏:

在在某些時候編譯代碼的過程中,你將不得不做寄存器分配。編譯器將執行一個干擾圖(「變量」是節點,如果它們同時處於活動狀態,它們將連接)。從這一點出發,有一個線性過程可以進行圖着色:對於每個變量,分配一個不會干擾其他變量的寄存器......如果沒有足夠的寄存器對圖進行着色,算法將失敗 和變量(寄存器)將被溢出(移至內存)。

從軟件工程的角度來看,這意味着您應該始終最小化活動變量,以便儘可能減少發生泄漏的可能性。

如果你想優化代碼,你應該尋找這些東西,因爲泄漏會給讀/寫內存帶來額外的時間。我正在尋找一個工具或編譯器的標誌,可以告訴我哪裏溢出,所以我可以優化。

+4

什麼是泄漏? – 2010-12-04 19:11:57

+1

看看我的編輯:-) – 2010-12-04 20:47:56

回答

4

我知道沒有這樣的工具。

由於對泄漏決定從編譯器編譯器,甚至由給定的編譯器的特定版本中設置的編譯器和版本不同,任何這樣的工具都必須緊密耦合到一個編譯器和可能僅支持一個。

另一方面,您可以隨時查看生成的程序集並查看給定的變量是否溢出。

0

一般反彙編或編譯爲彙編代替對象。

對於特定的編譯器,如gcc和llvm(你有源代碼並且可以輕鬆地重新編譯編譯器),修改編譯器打印某種輸出以表明它有多少次泄漏,就像你說的那樣,記憶。也許在您找到寄存器分配例程時,您可能會發現編譯器已經有了這樣的輸出。就我個人而言,我只是反彙編或編譯爲彙編程序。

一個通用的彙編器分析工具是可能的,但它是值得的努力?你會想知道函數/優化邊界在哪裏。你會想區分易失性變量,或硬件寄存器寫入ram是故意的。你只能尋找基於堆棧的寫入。或者查找寫入堆棧的情況,這不是一次推送,其中寄存器在下一條指令中被銷燬。實際上,搜索對堆棧指針相對地址的寫操作是相當容易的,下一條指令銷燬寄存器,並且該堆棧的相對地址在相鄰的執行路徑中被讀回,堆棧幀尚未被清理那個執行路徑。我知道這樣的工具嗎?不。