如何使g ++拒绝任何展示未定义行为的代码?

bit*_*ask 4 c++ gcc standards-compliance

我想CXXFLAG在我的构建系统中添加一个强制整个代码库的定义.因此,编译器应拒绝以静态方式展示未定义行为的每一段代码.

例如reinterpret_cast<A*>(someIntPtr)->aMember,没有任何运行时上下文未定义(a),而int i = bar(); i /= i;可能导致未定义的行为(b)取决于运行时评估bar()(可能返回零).
我只希望抓住(a)案件,而不一定是(b)案件.

Jon*_*ler 7

我不确定你的目标在计算上是否可行.

但是,你会适度地接近-Wall -Wextra -Werror; 查看其他警告选项以查看您要启用的其他内容.


Ker*_* SB 6

不可能.UB的许多实例是无法检测到的.这可以说是原因为什么他们是UB,正是因为它是不可能赶上在编译时这些问题.

一些例子:

  • int n = 0; std::cin >> n; ++n;签名溢出是UB.(依赖于值的 UB的示例.)

  • double d = std::sin(some_user_value); int n = d;UB如果d不能表示为int.(同上.)

  • 编译多个翻译单元,每个翻译单元具有不同的类定义.(由于编译模型的限制,UB的示例.)

  • 任何竞争条件都是UB的定义.(示例内存模型相关的UB.)

  • 滥用可变函数.(由于类型系统导致的UB示例.)