wjl*_*wjl 6 c c++ gcc undefined-behavior
在处理未定义的行为时,主要的开源项目使用了一些GCC标志来解决编译器过于敏锐的问题,特别是在C和C++语言中.例如:
-fno-strict-aliasing是那些在打字时需要"传统"行为的人的主食.例如:https://lkml.org/lkml/2003/2/26/158
-fwrapv通常用于希望具有已签名溢出的已知行为.例如:http://archives.postgresql.org/pgsql-hackers/2005-12/msg00635.php
那还有什么?我显然可以从GCC文档中获取完整列表,其中标记将未定义的行为转换为什么样的实现定义行为.但是,我更感兴趣的是主要开源项目使用哪些选项以及为什么?
-D_GLIBCXX_DEBUG 并不完全是一个编译器标志,但它启用了检查的 STL 迭代器和其他好东西。
std::vector<int> v(42);
v[42] = 1; //The standard says this is UB. With checked iterators you will get a run-time exception.
Run Code Online (Sandbox Code Playgroud)