2012-04-14 2 views
5

멀티 스레드 C 응용 프로그램에서이 오류가 발견되었습니다. 저자는 커스텀 어썰트 (custom assert) 기능에서 쓰레드 크래쉬 (thread crash)를 만드는 데 사용된다는 의견을 제시했다. GCC는 그것으로 괜찮지 만, 그 소리는 다음과 같은 경고 발행 :* (int *) NULL = 1; 문제가 있습니까?

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

을 또한 어설 션 기능의 각 사용량, 그 중 하나 발행 :

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

가 무슨 일이야? __builtin_trap은 clang에만 해당합니까? 그것을 사용해야합니까?

+3

스레드 크래시와 같은 문제는 없습니다. 모든 충돌이 전체 프로그램을 충돌시킵니다 ... –

답변

10

쓰기 NULL에 주소, 안정적으로 프로그램을 충돌을 보장 그것에 대해 너무 GCC introduced __builtin_trap되지 않는다 (C11은 exit, _Exit, quick_exitabort있다).

clang이 (가) 더 나아 가기로 결정한 것처럼 보입니다. 그런 쓰기를 모두 제거하여 거의 __builtin_trap을 사용하게했습니다. NULLvolatile 포인터로 캐스팅하는 다른 옵션은 "단지"정의되지 않은 동작이므로 __builtin_trap에 비해 매력적이지 않습니다.

+0

GCC 확장을 지원하지 않고 다른 컴파일러가 컴파일 한 코드를 만지면 '휘발성'이 가장 쉬운 방법 일 수 있습니다. – Yirkha

2

이 문은 정의되지 않은 동작을 제공합니다. 특히 컴파일러는 주소 0에 어떤 것을 저장하려고 할 의무가 없으며이를 최적화 할 수 있습니다. 이것은 컴파일러에서 여러분에게 말하는 것입니다.

전체 프로세스 실행을 종료하려면 exit() 또는 abort() 또는 일부 파생 제품을 사용하십시오. 이것은 휴대가 가능합니다.