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

5
我正在研究将大量(>10M行)的C++代码移植到64位的方法。我已经查看了静态代码分析器和编译器标志,现在正在寻找宏或其他工具,可以进行常见且重复的更改。
我编写了一些正则表达式来测试它们在实践中的效果,如预期的那样,它们非常有效。尽管如此,构建这些表达式需要一段时间,因此我想看看是否有任何这样的表达式列表或软件工具可以自动执行更改。
以下是要匹配和修复的典型代码示例。(为了澄清,这些行不是表示单个代码块,而是从不同位置提取的行。)
int i = 0;
long objcount;
int count = channels.count(ch);
for (int k = 0; k < n; k++) { /*...*/ }

目标不是彻底将代码移植到64位,而是对代码进行第一次检查,以减少需要手动检查的代码量。有些必要的更改可能会被忽略,有些错误的更改可能会被误操作,但这些应该尽量减少。

Visual Studio是用于转换工作的IDE,因此与VS兼容良好的工具是一个加分项。成本不是问题。


4
这些行需要在什么意义上进行修正? - Oliver Charlesworth
1
@Oli:这个例子没有展示,但是int count可能太小了,无法容纳channels.countsize_t返回值。在for循环中,int k可能会在达到long n的大小之前就被包装。等等。 - Zan Lynx
2
@Henry,为什么在32位中int是可以的,但在64位中不行呢? - user2100815
2
在我移植的代码中(这些代码显然是考虑到可能要移植到64位),编译器将所有问题都标记为警告。修复并不总是将类型提升为size_t;在某些情况下,需要添加强制转换(或运行时检查)以明确32位是适当的。 - Alan Stokes
4
@Henry:我怀疑你不会找到这样的工具,因为正确的代码在移植时运行得很好。而不正确的代码的问题在于它不遵守任何规则,因此很难让自动化工具处理。 - jalf
显示剩余11条评论
2个回答

1

正则表达式存在高误报率问题;按照定义,"正则表达式"无法解析像C++这样的上下文无关语言。此外,正则表达式也无法考虑类型信息;

   fooT i=0;

好的,对于一些typedef'd fooT?最后,正则表达式无法更改代码;您可以考虑使用Perl或SED(使用正则表达式来驱动更改),但由于正则表达式的误报,您将获得错误的更改。在1000万行代码中,这可能不是一件有趣的事情;5%的错误率意味着可能需要手动修复50000行代码。

您可以考虑使用程序转换工具。这些引擎基于语言结构而非文本运作,并且更复杂的版本了解范围、类型和符号的含义(例如,fooT到底是什么?)。它们为您提供编写特定于语言和上下文的模式的能力,并提出结构正确的代码更改,使用目标语言的表面语法。这使得可靠地应用规模化的代码更改成为可能。

我们的DMS软件重构工具包及其C++前端已被用于以语法和类型准确的方式对大型C++系统进行大规模更改。 (参见Akers,R.,Baxter,I.,Mehlich,M.,Ellis,B.,Luecke,K.,案例研究:通过自动程序转换重新设计C++组件模型,信息与软件技术49(3):275-291 2007年。)


我使用自动化的目标是减少需要手动检查的代码量,而不是解决所有问题。是的,正则表达式可能会出现误报,它肯定不能捕捉到所有东西,但是对于工作的理想表达式本质上是保守的。你的工具包看起来很有趣,但除了比正则表达式“更聪明”之外,它如何帮助呢?(换句话说,它能执行任何其他重构操作吗,除了识别表达式并根据某些规则进行更改?它对于64位转换项目会做多少?) - Henry Merriam
@Henry:关于误报的争论在于你能容忍多少。一个真正保守的检测器会认为所有东西都需要注意,但这完全浪费你的时间。你想要的是最紧密、最保守的检测器,并且需要进行实际解析和名称解析才能做到这一点。我很惊讶我的关于fooT的例子没有说服你;除了保守地总是说“可能有错”之外,没有正则表达式可以帮助你。... - Ira Baxter
@Henry:话虽如此,像DMS这样的工具的价值在于它不仅可以检测到您可能存在的问题,而且还可以实际更改代码。您甚至可以进行实验性更改(因为您始终可以在原始源上再次运行修订版本的工具)。因此,与正则表达式相比,您可以获得更好的检测、更少的误报和一些自动化更改。相比之下,有什么不喜欢的呢?1000万行是一个相当庞大的代码库。 - Ira Baxter
我同意它可以提供比正则表达式更好的检测和更好的更改(尽管我必须指出,正则表达式也可以修改代码)。 而且,正则表达式是免费的,支持内置于Visual Studio中(尽管具有令人讨厌的正则表达式语法)。 我不怀疑DMS是一个强大的工具,我只是对成本与效益感到不确定。 首先,我需要哪些软件包才能处理ANSI和VC ++ 6代码? DMS以前用于帮助64位转换吗? - Henry Merriam
@Henry:欢迎您在VS中尽情输入正则表达式(当您有1000万行代码时,它的响应速度如何?)。我只是不相信您有心思为1000万行代码和可能遇到的所有问题而这样做。对于DMS,您只需要VC++6前端;据我所知,它完全包含ANSI。DMS以前没有用于64位转换;它已被用于自动化大规模C++源代码的架构重组。 - Ira Baxter

0
你使用的编译器版本是什么?你尝试使用 /Wp64 标志运行编译器来检测 64 位问题的可移植性了吗?
从微软网站上可以看到: “/Wp64 可以检测带有 __w64 关键字标记的类型的 64 位可移植性问题。在 Visual C++ 32 位编译器中,默认情况下关闭 /Wp64,在 Visual C++ 64 位编译器中默认打开。”

http://msdn.microsoft.com/en-us/library/yt4xw8fh%28v=vs.71%29.aspx


是的,我已经查看了/Wp64标志。它很有帮助,但它会产生太多的警告,需要逐个检查整个代码库中的每一个警告。 - Henry Merriam
2
那个标志现在已被弃用。只需在64位目标上运行编译器,即可获得更准确的诊断。 (即使在32位平台上也可以这样做。) - Alan Stokes
该标志在VS2005中引入,旨在“准备”您编写64位平台的代码。但在VS2008中,它被认为已过时,您应直接构建并以x64 / IA64作为目标平台。 - Marius Bancila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接