6

これは、マルチスレッドの C アプリケーションで見つかりました。作成者は、カスタム アサート関数でスレッドをクラッシュさせるために使用されているとコメントしています。GCC は問題ありませんが、clang は次の警告を発行します。

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 固有のものですか? 使うべきですか?

4

2 に答える 2

11

アドレスへの書き込みNULLは、プログラムを確実にクラッシュさせるとは限らないため、そのためにGCC が導入され__builtin_trapました。

clang はさらに進んで、そのような書き込みを完全に排除することを決定したようです__builtin_trap。ポインターにキャストNULLする他のオプションは、「単に」未定義の動作であるため、 にvolatile比べて魅力的に見えません。__builtin_trap

于 2012-04-14T11:44:00.747 に答える
3

このステートメントは、未定義の動作を引き起こします。特に、コンパイラはアドレスに何かを格納しようとする義務はなく、0これを最適化する可能性があります。これは、コンパイラがあなたに言っていることです。

exit()または派生物の一部を使用abort()して、プロセス全体の実行を終了します。これはポータブルです。(C11 はexit_Exitquick_exitおよびabort)

于 2012-04-14T11:42:29.000 に答える