通常会对一个正在编码的特定平台做出假设,例如,有符号整数使用两个补码存储,或(0xFFFFFFFF == -1)
或那种性质的东西。
是否存在可以检查代码库以查找最常见的违反这类事件的工具(对于我们这些想要可移植代码但没有奇怪的非二进制补充机器的人)?
(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣)
答案 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等等,但我认为这会导致很多误报。
[对不起,不是真正的答案,但评论时间太长]