是否有任何C ++工具可以检查常见的未指定行为?

时间:2010-11-29 16:19:21

标签: c++ unspecified-behavior

通常会对一个正在编码的特定平台做出假设,例如,有符号整数使用两个补码存储,或(0xFFFFFFFF == -1)或那种性质的东西。

是否存在可以检查代码库以查找最常见的违反这类事件的工具(对于我们这些想要可移植代码但没有奇怪的非二进制补充机器的人)?

(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣)

4 个答案:

答案 0 :(得分:4)

您可能希望打开各种级别的编译器警告,并且可以将警告视为错误。

如果您知道在代码中的各个点处进行了其他假设,则可以断言它们。如果你能用静态断言做到这一点,你将在编译时失败。

答案 1 :(得分:4)

我知道CLang非常积极地开发静态分析器(作为库)。

目标是在分析时捕获错误,但是所捕获的错误的确切程度对我来说还不是很清楚。该库名为“Checker”,T. Kremenek负责,您可以在clang-dev邮件列表中询问。

我没有任何关于正在执行的检查的参考的印象,我认为它对于生产工具还不够成熟(考虑到正在进行的更改率),但它可能是值得的一看。

答案 2 :(得分:3)

也许是静态代码分析工具?几年前我用了一个,它报告了这样的错误。它不完美而且仍然有限,但现在工具可能更好吗?

更新: 也许其中一个: What open source C++ static analysis tools are available?

UPDATE2: 我在你的例子上尝试过FlexeLint(你可以在http://www.gimpel-online.com/OnlineTesting.html上使用自己动手的例子在线试试)并且它抱怨它但可能不是你想要的方式:

5    int i = -1;
6    if (i == 0xffffffff)
diy64.cpp  6  Warning 650:  Constant '4294967295' out of range for operator '=='
diy64.cpp  6  Info 737:  Loss of sign in promotion from int to unsigned int
diy64.cpp  6  Info 774:  Boolean within 'if' always evaluates to False [Reference: file diy64.cpp: lines 5, 6]

答案 3 :(得分:2)

非常有趣的问题。我认为编写一个有用的标记工具将是一个很大的挑战,因为这很大程度上取决于程序员的意图/假设

例如,很容易识别出如下构造:

x &= -2; // round down to an even number

依赖于二进制补码表示,但如果掩码是变量而不是常量“-2”怎么办?

是的,您可以更进一步,并警告任何使用带有按位&的带符号的int,对unsigned int的任何负常量赋值,以及对unsigned的任何signed int赋值int等等,但我认为这会导致很多误报。

[对不起,不是真正的答案,但评论时间太长]