在调试一个程序崩溃的错误指针被解除引用的问题时,我运行了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) {
答案 0 :(得分:0)
-O0
适用于
缩短编译时间并使调试产生预期效果 结果。这是默认值。
与相应的源代码进行比较可能会很有趣。