我想在我的构建系统中添加一个CXXFLAG
,强制整个代码库得到很好的定义。因此,编译器应拒绝以静态方式展示未定义行为的每一段代码。
例如reinterpret_cast<A*>(someIntPtr)->aMember
没有任何运行时上下文未定义(a),而int i = bar(); i /= i;
可能导致未定义的行为(b),具体取决于bar()
的运行时评估(可能返回零) )。
我只希望抓住(a)案件,而不一定是(b)案件。
答案 0 :(得分:7)
我不确定你的目标在计算上是否可行。
但是,-Wall -Wextra -Werror
会使你接近中度;查看其他警告选项,了解您想要启用的其他内容。
答案 1 :(得分: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示例。)
答案 2 :(得分:1)
您可以使用类似于经典lint
的静态代码分析工具。您可能已经cppcheck。
答案 3 :(得分:1)
你不能,你不应该依赖编译器为你指出UB。
最好的办法是使用-Werror
导致所有警告都出错,then enable a great deal of warnings.