在调试因解引用的指针损坏而导致程序崩溃的问题时,我运行了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用于


  减少编译时间并使调试产生预期的效果
  结果。这是默认值。


与相应的源代码进行比较可能很有趣。

10-07 20:21