Прерывание потоков с * (int *) NULL = 1; проблематично?

Я нашел это в многопоточном приложении c. Авторы отметили, что он используется для сбоя потока в пользовательской функции assert. GCC в порядке, но clang выдает следующее предупреждение:

<code>note: consider using __builtin_trap() or qualifying pointer with 'volatile'
</code>

а также выдает один из них для каждого использования функции assert:

<code>warning: indirection of non-volatile null pointer will be deleted, not trap
</code>

Что здесь происходит? __Builtin_trap специфичен для clang? Должен ли я использовать это?

 R..14 апр. 2012 г., 14:27
Обратите внимание, что нет такой вещи, как прерывание потока; любой сбой вылетает вся программа ...

Ответы на вопрос(2)

Решение Вопроса

NULL адрес не гарантирует сбой вашей программы надежно, поэтомуGCC введен__builtin_trap для этого.

Похоже, Clang решил пойти дальше, и полностью исключить такие записи, почти заставляя вас использовать__builtin_trap, Их другой вариант кастингаNULL вvolatile указатель не выглядит привлекательно по сравнению с__builtin_trapпотому что это "просто" неопределенное поведение.

 17 нояб. 2017 г., 02:35
Тем не менее, просто добавив, чтоvolatile может быть самый простой выход, если вы касаетесь кода, скомпилированного другими компиляторами без поддержки расширений GCC.

не обязан пытаться что-то хранить по адресу0 и может оптимизировать это. Это то, что говорят вам компиляторы.

использованиеexit() или жеabort() или некоторые из производных, чтобы прекратить выполнение всего процесса. Это портативный. (С11 имеетexit, _Exit, quick_exit а такжеabort)

Ваш ответ на вопрос