Editar: gracias a @NateEldredge, definí mejor mi pregunta en ¿Cómo 'etiquetar' una ubicación en un archivo fuente C para una definición de punto de interrupción posterior?
Uso esas etiquetas para configurar puntos de interrupción en gdb. Así que no importa si agrego o elimino líneas de código después o antes de la etiqueta, el punto de interrupción sigue siendo correcto.
Si agrego -Wno-error=unused-label a las opciones de compilación, el compilador no me grita, pero la etiqueta desaparece del ensamblado.
Si, en cambio, uso __attribute__((unused)) en el código, el resultado es el mismo: no hay queja, pero la etiqueta desaparece.
¿Hay una forma correcta de hacer esto (en lugar de solo un truco)?
Aquí está mi ejemplo de juguete:
int main(void){ int a = 15; label: __attribute__((unused)) a = a + 23; return a; }Después de la compilación, da como resultado:
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 retAquí una versión interactiva del mismo ejemplo: 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.Si desea tener una etiqueta que no se elimine ni cambie de nombre, intente esto:
asm volatile("mylabel:"); Tenga en cuenta que tener esta etiqueta puede afectar la forma en que GCC optimiza su función. Sin embargo, la palabra clave volatile probablemente ayudará a evitar que haga algo que pueda causar problemas.
También tenga en cuenta que puede usar __asm__ en lugar de asm . Ambos parecen funcionar en GCC.
Puede silenciar la advertencia de etiqueta no utilizada... usándola:
int main(int argc, char** argv) { int a = 15; goto label; label: a = a + 23; return a; }Esto mantiene la etiqueta en el ensamblado (aunque usando un nombre interno):
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 retSugeriría usar una macro para reducir el esfuerzo y mostrar mejor la intención:
#define DEBUG_LABEL(x) goto x; x: