C 为什么是叮当声';s汇编程序输出有条件跳转到无条件跳转?
在调试一个程序在被取消引用的损坏指针上崩溃的问题时,我运行了C 为什么是叮当声';s汇编程序输出有条件跳转到无条件跳转?,c,macos,clang,code-generation,compiler-optimization,C,Macos,Clang,Code Generation,Compiler Optimization,在调试一个程序在被取消引用的损坏指针上崩溃的问题时,我运行了lldb,并对崩溃函数进行了反汇编。在仔细阅读反汇编代码时,我注意到这种奇怪的指令选择: -O0用于 减少编译时间,并使调试产生预期效果 结果。这是默认设置 与相应的源代码进行比较可能会很有趣。您的代码是在调试模式下编译的吗?如果是这样,这就可以解释为什么汇编代码是这样写的。它是用-O0-g3编译的。它产生了一个跳转到一个跳转,这似乎有点奇怪,但这可能可以解释它。既然你也添加了标记C:产生这段代码的源代码行是什么?@RadLexus我添
lldb
,并对崩溃函数进行了反汇编。在仔细阅读反汇编代码时,我注意到这种奇怪的指令选择:
-O0
用于
减少编译时间,并使调试产生预期效果
结果。这是默认设置
与相应的源代码进行比较可能会很有趣。您的代码是在调试模式下编译的吗?如果是这样,这就可以解释为什么汇编代码是这样写的。它是用
-O0-g3
编译的。它产生了一个跳转到一个跳转,这似乎有点奇怪,但这可能可以解释它。既然你也添加了标记C:产生这段代码的源代码行是什么?@RadLexus我添加了原始代码,添加了一点额外的上下文,如果有兴趣,还添加了一个指向Github上原始C文件的链接。
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
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) {