【问题标题】:Crashing threads with *(int*)NULL = 1; problematic?*(int*)NULL = 1 导致线程崩溃;有问题?
【发布时间】:2012-04-14 11:29:42
【问题描述】:

我在一个多线程的 c 应用程序中发现了这个。作者评论说,它用于在自定义断言函数中使线程崩溃。 GCC 没问题,但 clang 发出以下警告:

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

并且还针对 assert 函数的每次使用发出其中一个:

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

这里发生了什么? __builtin_trap 是特定于 clang 的吗?我应该使用它吗?

【问题讨论】:

  • 请注意,没有使线程崩溃的事情;任何崩溃都会导致整个程序崩溃...

标签: c clang assert volatile gcc-warning


【解决方案1】:

写入NULL 地址并不能保证可靠地使您的程序崩溃,所以GCC introduced __builtin_trap 就是为了这个。

看起来clang 决定走得更远,完全消除此类写入,几乎迫使您使用__builtin_trap。与__builtin_trap 相比,他们将NULL 转换为volatile 指针的另一种选择看起来并不吸引人,因为它“只是”一种未定义的行为。

【讨论】:

  • 也就是说,如果您正在接触由其他编译器编译但不支持 GCC 扩展的代码,只需添加 volatile 可能是最简单的方法。
【解决方案2】:

该语句会引发未定义的行为。特别是编译器没有义务尝试在地址0 存储一些东西,并且可以优化它。这是编译器告诉你的。

使用exit()abort() 或一些派生词来终止整个流程的执行。这是便携式的。 (C11有exit_Exitquick_exitabort

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多