在调试因解引用的指针损坏而导致程序崩溃的问题时,我运行了lldb
并对崩溃功能进行了反汇编。在仔细阅读反汇编的代码时,我注意到这种奇怪的指令选择:
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
用于
减少编译时间并使调试产生预期的效果
结果。这是默认值。
与相应的源代码进行比较可能很有趣。