【问题标题】:static code analysis tools for spotting 64bit portability problems?用于发现 64 位可移植性问题的静态代码分析工具?
【发布时间】:2011-09-19 12:37:11
【问题描述】:

我正在寻找将大量代码转换为 64 位的最佳方法。有人建议我研究一些静态代码分析工具,例如 cpptest,以发现可移植性问题。有人对我可以使用什么有任何建议吗?还是将代码移植到 64 位的有效方法?

环境:windows、vs2008(我知道 VS 中的“检测 64 位可移植性问题”选项,但我需要更好的)。

示例:一个可以发现这种明显类型的 64 位可移植性错误的工具。

for (int i = 0; i < 64; i++)
{
    __int64 n64 = (1 << i); // Does not generate warning
}

【问题讨论】:

  • 64 位可移植性问题 怎么样?好像在移植之前就已经坏掉了。我会更担心for (int i = 0; i != 32; ++i) { unsigned long k = 1&lt;&lt;i; foo(k); } - 32 可能需要变成 64,但在静态代码分析中很难分辨。
  • 64 位编译器是一个相当不错的诊断工具,只要将警告级别设置为 11。

标签: c++ 64-bit portability static-analysis


【解决方案1】:

试试 PVS-Studio:http://pvs-studio.viva64.com/,它提供了特定的规则集来发现 64 位可移植性问题

【讨论】:

  • 正如您的回复,我正在查看该网站。这是向我建议的一个选项,但它很昂贵......
  • 是的,但是他们有试用版可能会有所帮助,我前段时间用过,有时真的很有用
【解决方案2】:

Frama-C 是一个可扩展的 C 分析框架(仅限),带有用于检测未定义行为的 plug-in

让我们在您的示例中尝试一下:

main(){
  for (int i = 0; i < 64; i++)
  {
    long long n64 = (1 << i);
  }
}

这个插件原本不是用来找bug的,所以你必须原谅糟糕的界面和相当严格的使用条件:

$ frama-c -val t.c
...
t.c:4:[kernel] warning: invalid shift: assert i ≥ 0 ∧ i < 32;

条件i ≥ 0 ∧ i &lt; 32 表示在第 4 行应为真以定义班次的条件。一旦向您指出了问题,您就可以推断出,1 的类型为 int,并且在此架构上将其移动超过 32 是未定义的。

这是你想看到的警告吗?

同样,Frama-C 仅适用于 C,因此只有在您要调查的项目的一部分位于 C 中时,您才能利用它。

【讨论】:

  • 是的,这就是我想看到的警告,这只是我们无法捕捉到的问题的一个例子。不幸的是,我们的大部分代码都是用 c++ 编写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多