2012-04-14 21 views
5

Ich fand dies in einer Multi-Thread-c-Anwendung. Die Autoren kommentierten, dass damit in einer benutzerdefinierten Assert-Funktion ein Thread abstürzt. GCC ist mit ihm in Ordnung, aber Klirren gibt die folgende Warnung:Absturz von Threads mit * (int *) NULL = 1; problematisch?

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

und gibt auch einer von denen, für jede Nutzung der Funktion assert:

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

Was ist hier los? Ist __builtin_trap spezifisch für clang? Soll ich es benutzen?

+3

Beachten Sie, dass es keinen Crash gibt. jeder Absturz stürzt das ganze Programm ab ... –

Antwort

10

Schreiben auf NULL-Adresse ist garantiert nicht das Programm zuverlässig zum Absturz zu bringen, so GCC introduced __builtin_trap dafür.

Es sieht so aus, als ob clang entschieden hat, weiter zu gehen und solche Schreibvorgänge komplett zu eliminieren, was fast dazu zwingt, __builtin_trap zu verwenden. Ihre andere Option, NULL zu volatile Zeiger zu werfen, sieht im Vergleich zu __builtin_trap nicht attraktiv aus, weil es "nur" ein undefiniertes Verhalten ist.

+0

Das gesagt, nur hinzufügen, dass "flüchtig" der einfachste Weg sein könnte, wenn Sie Code berühren, der auch von anderen Compilern ohne Unterstützung für GCC-Erweiterungen kompiliert wird. – Yirkha

2

Die Aussage provoziert undefiniertes Verhalten. Insbesondere ist der Compiler nicht verpflichtet, etwas unter der Adresse 0 zu speichern und kann dies optimieren. Das sagen Ihnen die Compiler.

Verwenden Sie exit() oder abort() oder einige der Derivate, um die gesamte Prozessausführung zu beenden. Dies ist tragbar. (C11 hat exit, _Exit, quick_exit und abort)