10

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

是否存在一种工具可以检查代码库中最常见的违规行为(对于我们这些想要可移植代码但没有奇怪的非二进制补码机器的人)?

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

4

4 回答 4

4

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

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

我不认为有任何关于正在执行的检查的参考,而且我认为它对于生产工具来说还不够成熟(考虑到变化的速度),但它可能值得一看。

于 2010-11-29T17:55:46.260 回答
4

您可能希望打开不同级别的编译器警告,您可以将警告视为错误。

如果你知道你在代码的不同点做了其他假设,你可以断言它们。如果您可以使用静态断言来做到这一点,那么您将在编译时失败。

于 2010-11-29T16:25:53.027 回答
3

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

更新:也许其中之一:有 哪些开源 C++ 静态分析工具可用?

update2:我在您的示例中尝试了 FlexeLint(您可以使用http://www.gimpel-online.com/OnlineTesting.html上的 Do-It-Yourself Example 在线尝试)并且它抱怨它,但可能不是以某种方式您正在寻找:

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]
于 2010-11-29T17:23:59.727 回答
2

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

例如,很容易识别如下结构:

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

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

是的,您可以更进一步,并警告将带符号的 int 与 bitwise 的任何使用、&将负常量分配给 unsigned int 以及将有符号 int 分配给 unsigned int 等等,但我认为这将导致大量误报。

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

于 2010-11-29T17:21:37.090 回答