2012-04-14 15 views
5

Znalazłem to w wielowątkowej aplikacji c. Autorzy skomentowali, że jest on używany do spowodowania awarii wątku w niestandardowej funkcji assert. GCC jest w porządku z nim, ale dzyń wystawia następujące ostrzeżenie:Zawieszenie wątków z * (int *) NULL = 1; problematyczny?

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

a także wystawia jedną z tych, dla każdego użycia funkcji assert:

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

Co tu się dzieje? Czy __builtin_trap jest specyficzne dla clanga? Czy powinienem go używać?

+3

Zauważ, że nie ma czegoś takiego jak ranienie wątku; każda awaria powoduje zawieszenie całego programu ... –

Odpowiedz

10

Pisanie do NULL adres nie jest gwarantowana do awarii programu niezawodnie, tak GCC introduced __builtin_trap za to.

Wygląda na to, że klang postanowił pójść dalej, i całkowicie wyeliminować takie zapisy, niemal zmuszając cię do użycia __builtin_trap. Ich druga opcja rzutowania wskaźnika NULL na volatile nie wygląda atrakcyjnie w porównaniu z __builtin_trap, ponieważ jest "tylko" niezdefiniowanym zachowaniem.

+0

To powiedziawszy, po prostu dodanie 'volatile' może być najłatwiejszym wyjściem, jeśli dotykasz kodu skompilowanego również przez inne kompilatory bez obsługi rozszerzeń GCC. – Yirkha

2

Instrukcja dostarcza nieokreślonego zachowania. W szczególności kompilator nie jest zobowiązany do próby przechowywania czegoś pod adresem 0 i może to zoptymalizować. Oto, co mówią ci kompilatorzy.

Użyj exit() lub abort() lub niektórych pochodnych, aby zakończyć wykonywanie całego procesu. To jest przenośne. (C11 ma exit, _Exit, quick_exit i abort)

Powiązane problemy