相关疑难解决方法(0)

是否存在将C++代码移植到64位的自动转换工具?

我正在研究将大量(> 10M行)数量的C++代码移植到64位的方法.我查看了静态代码分析器和编译器标志,现在我正在研究可以进行常见重复更改的宏或其他工具.

我写了一些正则表达式,看看它们在实践中的表现如何,正如预测的那样,它们非常有效.也就是说,首先构建表达式需要一段时间,所以我想看看是否有任何可以自动执行更改的表达式或软件工具列表.

以下行是要匹配和修复的代码的原型示例.(为了澄清,这些行并不代表单个代码块,而是从不同的地方拉出的行.)

int i = 0;
long objcount;
int count = channels.count(ch);
for (int k = 0; k < n; k++) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

目标不是将代码彻底移植到64位,而是对代码执行第一次传递以减少需要手动检查的代码量.可以错过一些必要的更改,并且可能会做出一些错误的更改,但这些更改应该最小化.

Visual Studio是将用于转换工作的IDE,因此适用于VS的东西是一个优点.成本不是问题.

c++ 64-bit 32bit-64bit

5
推荐指数
0
解决办法
1335
查看次数

如何检测难以捉摸的 64 位可移植性问题?

我在准备用于 64 位端口的一些(C++)代码中发现了一个与此类似的片段。

int n;
size_t pos, npos;

/* ... initialization ... */

while((pos = find(ch, start)) != npos)
{
    /* ... advance start position ... */

    n++; // this will overflow if the loop iterates too many times
}
Run Code Online (Sandbox Code Playgroud)

虽然我严重怀疑这实际上会在内存密集型应用程序中引起问题,但从理论的角度来看还是值得的,因为可能出现类似的错误,从而导致问题。(在上面的例子中更改n为 a short,即使是小文件也可能溢出计数器。)

静态分析工具很有用,但它们不能直接检测这种错误。(无论如何还没有。)计数器n根本不参与while表达式,所以这不像其他循环那样简单(类型转换错误会导致错误消失)。任何工具都需要确定循环将执行超过 2 31次,但这意味着它需要能够估计表达式(pos = find(ch, start)) != npos将评估为真的次数——这可不是一件小事!即使一个工具可以确定循环可以执行超过 2 31次(比如说,因为它识别出find函数正在处理一个字符串),它怎么知道循环不会执行超过 2 64 次次,也溢出一个size_t值? …

c++ 64-bit portability 32bit-64bit

5
推荐指数
1
解决办法
791
查看次数

标签 统计

32bit-64bit ×2

64-bit ×2

c++ ×2

portability ×1