编辑:感谢@NateEldredge,我在如何';标签';C源文件中用于以后断点定义的位置?
我使用这些标签在gdb中设置断点。因此,无论我在标签之后/之前添加/删除代码行,断点仍然是正确的。
如果我将-Wno-error=unused-label
添加到编译选项中,编译器不会对我大喊大叫,但标签会从程序集中消失。
如果我在代码中使用__attribute__((unused))
,结果是一样的:没有抱怨,但标签消失了。
有没有一种正确的方法来完成这件事(而不仅仅是黑客(?
这是我的玩具示例:
int main(void){
int a = 15;
label: __attribute__((unused))
a = a + 23;
return a;
}
编译后,结果为:
main:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 15
add DWORD PTR [ebp-4], 23
mov eax, DWORD PTR [ebp-4]
leave
ret
以下是同一示例的交互式版本:https://godbolt.org/z/zTqd9bM6q
$ gcc --version
gcc (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
如果您想要一个不会被删除或重命名的标签,请尝试以下操作:
asm volatile("mylabel:");
请注意,带有此标签可能会影响GCC优化功能的方式。但是,volatile
关键字可能有助于防止它做任何可能导致问题的事情。
还要注意,您可以使用__asm__
而不是asm
。两人似乎都在海湾合作委员会工作。
您可以使未使用的标签警告静音。。。通过使用它:
int main(int argc, char** argv) {
int a = 15;
goto label; label:
a = a + 23;
return a;
}
这将标签保留在程序集中(尽管使用内部名称(:
main:
.LFB0:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 15
nop
.L2:
add DWORD PTR [ebp-4], 23
mov eax, DWORD PTR [ebp-4]
leave
ret
我建议使用宏来减少工作量并更好地显示意图:
#define DEBUG_LABEL(x) goto x; x: