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

时间:2011-12-20 02:44:23

标签: c++ gcc standards-compliance

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

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

4 个答案:

答案 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.