我正在寻找将大量代码转换为64位的最佳方法。有人建议我研究一些静态代码分析工具,比如cpptest来发现可移植性问题。有没有人对我有什么建议可以使用?或者将代码移植到64位的有效方法?
环境:windows,vs2008(我知道VS中的“检测64位可移植性问题”选项,但我需要更好)。
示例:一个可以获取这种明显类型的64位可移植性错误的工具。
for (int i = 0; i < 64; i++)
{
__int64 n64 = (1 << i); // Does not generate warning
}
答案 0 :(得分:4)
尝试使用PVS-Studio:http://pvs-studio.viva64.com/,它提供了特定的规则集来发现64位可移植性问题
答案 1 :(得分:1)
Frama-C是C(仅)的可扩展分析框架,其plug-in用于检测未定义的行为。
让我们试试你的例子:
main(){
for (int i = 0; i < 64; i++)
{
long long n64 = (1 << i);
}
}
此插件最初并非用于偶然的错误查找,因此您必须原谅糟糕的界面和相当严格的使用条件:
$ frama-c -val t.c
...
t.c:4:[kernel] warning: invalid shift: assert i ≥ 0 ∧ i < 32;
条件i ≥ 0 ∧ i < 32
表示在第4行应该为了定义班次的条件。正如您在向我们指出问题时可以推断的那样,1
的类型为int
,并且在此体系结构上将其移动超过32
是未定义的。
这是你想看到的警告吗?
同样,Frama-C仅适用于C,因此如果您要调查的项目部分位于C中,您可能只会利用它。