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) {
您的代碼是否以調試模式編譯?如果是這樣,那可以解釋爲什麼彙編代碼是以這種方式編寫的。 –
它是用'-O0 -g3'編譯的。它似乎有點奇怪,它產生了跳躍跳躍,但這可能會解釋它。 –
由於您也添加了標籤C:導致此代碼的源代碼行是什麼? – usr2564301