2017-01-18 92 views
0

在調試與程序崩潰的一個錯位的指針的問題被廢棄時,我跑lldb,並做了崩潰功能的拆卸。在應聘的反彙編代碼,我注意到這一指令看起來很奇怪的選擇:爲什麼Clang的彙編程序輸出有條件跳轉到無條件跳轉?

0x100002b06 <+86>: cmpl $0x0, %eax 
0x100002b09 <+89>: je  0x100002b14 
0x100002b0f <+95>: jmp 0x10000330e 
0x100002b14 <+100>: jmp 0x100002c1d 

我希望的代碼看起來像這個:

0x100002b06 <+86>: cmpl $0x0, %eax 
0x100002b09 <+89>: je  0x100002c1d 
0x100002b0f <+95>: jmp 0x10000330e 

我我很好奇爲什麼Clang做出了這個選擇。這是否是某種分支預測優化,因爲這是一個非常不可能匹配的NULL指針檢查?

編輯:This is the originating C code,專門用NULL指針檢查行。

traverse = travdone_head; 
while (1) { 
    if (traverse == NULL) nullptr("grokdir() traverse"); 
    /* Don't re-traverse directories we've already seen */ 
    if (inode == traverse->inode && device == traverse->device) { 
+0

您的代碼是否以調試模式編譯?如果是這樣,那可以解釋爲什麼彙編代碼是以這種方式編寫的。 –

+0

它是用'-O0 -g3'編譯的。它似乎有點奇怪,它產生了跳躍跳躍,但這可能會解釋它。 –

+0

由於您也添加了標籤C:導致此代碼的源代碼行是什麼? – usr2564301

回答

0

-O0

減少編譯時間,使調試產生期望的結果 。這是默認設置。

這可能是有趣的與根據源代碼進行比較。