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

时间:2011-06-08 19:46:10

标签: c++ 64-bit 32bit-64bit

我正在研究将大量(> 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的东西是一个优点。成本不是问题。

2 个答案:

答案 0 :(得分:1)

Rexexps的误报率很高;根据定义,“正则表达式”不能解析诸如C ++之类的无上下文语言。此外,正则表达式无法进入 帐户类型信息;是

   fooT i=0;

好的,对于某些typedef'doo?最后,正则表达式无法改变代码;您可能会考虑使用Perl或SED(使用regexps来驱动更改),但由于正则表达式的误报,您将得到错误的更改。在10M SLOC,这不是一件好事; 5%的错误率意味着可以手动修复50,000行代码。

您可以考虑使用program transformation工具。这样的引擎在语言结构上运行,而不是文本,更复杂的版本知道范围,类型和符号的含义(例如,什么是fooT,究竟是什么?)。它们使您能够使用目标语言的表面语法编写语言和特定于上下文的模式,并提出结构上正确的代码更改。这样可以在规模上可靠地应用代码更改。

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

答案 1 :(得分:0)

您使用的是哪个版本的编译器?您是否尝试使用/ Wp64标志运行编译器来检测64位问题的可移植性?

来自MS网站: “/ Wp64检测到也用__w64关键字标记的类型的64位可移植性问题。/ Wp64在Visual C ++ 32位编译器中默认关闭,默认情况下在Visual C ++ 64位编译器中关闭。” p>

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