2012-04-14 11 views
5

Encontré esto en una aplicación c multiproceso. Los autores comentaron que se usa para hacer un bloqueo de hilo en una función de afirmación personalizada. GCC es muy bien con él, pero tañido emite la siguiente advertencia:Colapsar hilos con * (int *) NULL = 1; ¿problemático?

note: consider using __builtin_trap() or qualifying pointer with 'volatile' 

y también emite uno de ellos, para cada uso de la función de aserción:

warning: indirection of non-volatile null pointer will be deleted, not trap 

lo que está pasando aquí? ¿Es __builtin_trap específico para clang? ¿Debo usarlo?

+3

Tenga en cuenta que no existe la posibilidad de que se cuelgue un hilo; cualquier bloqueo bloquea todo el programa ... –

Respuesta

10

escritura a NULL dirección no está garantizado para bloquear el programa de forma fiable, por lo GCC introduced __builtin_trap para eso.

Parece que clang decidió ir más allá y eliminar tales escrituras en total, casi obligándote a usar __builtin_trap. Su otra opción de fundir NULL a volatile puntero no se ve atractiva en comparación con __builtin_trap, porque es "simplemente" un comportamiento indefinido.

+0

Dicho esto, simplemente agregar que 'volátil' podría ser la salida más fácil si está tocando código compilado también por otros compiladores sin soporte para extensiones GCC. – Yirkha

2

La declaración provoca un comportamiento indefinido. En particular, el compilador no está obligado a tratar de almacenar algo en la dirección 0 y puede optimizar esto. Esto es lo que los compiladores te están diciendo.

Utilice exit() o abort() o alguno de los derivados para finalizar la ejecución del proceso completo. Esto es portátil. (C11 tiene exit, _Exit, quick_exit y abort)

Cuestiones relacionadas