通常人们会假设一个正在编码的特定平台,例如有符号整数使用二进制补码存储,或者那个(0xFFFFFFFF == -1)
,或者那种性质的东西。
是否存在一种工具可以检查代码库中最常见的违规行为(对于我们这些想要可移植代码但没有奇怪的非二进制补码机器的人)?
(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣)
通常人们会假设一个正在编码的特定平台,例如有符号整数使用二进制补码存储,或者那个(0xFFFFFFFF == -1)
,或者那种性质的东西。
是否存在一种工具可以检查代码库中最常见的违规行为(对于我们这些想要可移植代码但没有奇怪的非二进制补码机器的人)?
(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣)
我知道 CLang 非常积极地开发静态分析器(作为库)。
目标是在分析时捕获错误,但是捕获的错误的确切程度对我来说还不是很清楚。该库被称为“Checker”,T. Kremenek 负责它,你可以在 clang-dev 邮件列表中询问它。
我不认为有任何关于正在执行的检查的参考,而且我认为它对于生产工具来说还不够成熟(考虑到变化的速度),但它可能值得一看。
您可能希望打开不同级别的编译器警告,您可以将警告视为错误。
如果你知道你在代码的不同点做了其他假设,你可以断言它们。如果您可以使用静态断言来做到这一点,那么您将在编译时失败。
也许是静态代码分析工具?几年前我用过一个,它报告了这样的错误。它并不完美,仍然有限,但现在工具可能更好?
更新:也许其中之一:有 哪些开源 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]
非常有趣的问题。我认为编写一个有用地标记这些的工具将是一个相当大的挑战,因为这在很大程度上取决于程序员的意图/假设
例如,很容易识别如下结构:
x &= -2; // round down to an even number
依赖于二进制补码表示,但是如果掩码是变量而不是常量“-2”怎么办?
是的,您可以更进一步,并警告将带符号的 int 与 bitwise 的任何使用、&
将负常量分配给 unsigned int 以及将有符号 int 分配给 unsigned int 等等,但我认为这将导致大量误报。
[对不起,不是真正的答案,但评论太长了]