【发布时间】:2017-06-03 06:28:07
【问题描述】:
在调试程序在被取消引用的错位指针上崩溃的问题时,我运行了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 -g3编译的。它产生了一个跳转到一个跳转似乎仍然有点奇怪,但这可能可以解释它。 -
既然您也添加了标签 C:导致此代码的源代码行是什么?
-
@RadLexus 如果有兴趣,我已经添加了带有一点额外上下文的原始代码和指向 Github 上原始 C 文件的链接。
标签: c macos clang code-generation compiler-optimization