bit*_*ask 4 c++ gcc standards-compliance
我想CXXFLAG在我的构建系统中添加一个强制整个代码库的定义.因此,编译器应拒绝以静态方式展示未定义行为的每一段代码.
例如reinterpret_cast<A*>(someIntPtr)->aMember,没有任何运行时上下文未定义(a),而int i = bar(); i /= i;可能导致未定义的行为(b)取决于运行时评估bar()(可能返回零).
我只希望抓住(a)案件,而不一定是(b)案件.
不可能.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示例.)