我要将非常大规模的应用程序移植到64位, 我注意到在网上有一些文章显示 这个移植的许多陷阱, 我想知道是否有任何工具可以帮助移植到64位,这意味着 找到需要更改的代码中的位置....也许启用了警告的gcc ......是否足够好?还有什么更好的吗?
编辑:伙计们我正在寻找一个工具,如果有任何可能对编译器来说是完整的, 我知道GCC可以asist,但我怀疑它会找到所有不便携的问题 将在运行时发现....也许是强调的静态代码分析工具 移植到64位?
感谢
答案 0 :(得分:4)
Here是指南。 Another one
某些数据类型的大小在32位和64位操作系统中是不同的,因此请检查代码假定数据类型大小的位置。例如,如果您正在转换指向int的指针,则无法在64位中运行。这应该解决大多数问题。
如果您的应用使用第三方库,请确保它们也能使用64位。
答案 1 :(得分:4)
一个好的工具称为grep
;-) do
grep -nH -e '\<int\>\|\<short\>\|\<long\>' *
并用适当的替换所有这些基本整数类型的所有裸使用:
size_t
uintptr_t
prtdiff_t
uintN_t
gcc
会发出所有警告,告诉您。您还可以使用clang
作为编译器,它可以提供更多诊断。
答案 2 :(得分:1)
首先,为什么要“移植”?
考虑到大多数发行版都为十多年提供了32位和64位变体。因此,除非你以真正不可移植的方式编程(而且你几乎要尝试),你应该没问题。
答案 3 :(得分:1)
如何在64位操作系统中编译项目? gcc编译器看起来像这样的工具:)
答案 4 :(得分:0)
以下是Oracle网页的链接,该网页讨论了将32位应用程序移植到64位时常遇到的问题:
http://www.oracle.com/technetwork/server-storage/solaris/ilp32tolp64issues-137107.html
一节讨论如何使用lint检测一些常见错误。以下是该部分的副本:
使用lint实用程序检测64位长和指针类型的问题 使用lint检查为32位和64位编译环境编写的代码。指定
-errchk=longptr64
选项以生成LP64警告。还使用-errchk=longptr64
标志来检查对于长整数和指针的大小为64位且普通整数的大小为32位的环境的可移植性。-errchk=longptr64
标志检查指针表达式和长整数表达式的赋值为纯整数,即使使用显式强制转换也是如此。使用
-errchk=longptr64,signext
选项查找正常的ISO C值保留规则允许在unsigned-integral类型的表达式中扩展有符号整数值的符号的代码。如果要检查要在Solaris 64位SPARC或x86 64位环境中运行的代码,请使用lint的-m64
选项。当lint生成警告时,它会打印违规代码的行号,描述问题的消息以及是否涉及指针。警告消息还指示所涉及数据类型的大小。当您知道涉及指针并且知道数据类型的大小时,您可以找到特定的64位问题并避免32位和更小类型之间存在的预先存在的问题。
您可以通过在上一行放置“NOTE(LINTED())”形式的注释来禁止给定代码行的警告。当您希望lint忽略某些代码行(如强制转换和赋值)时,这非常有用。使用“NOTE(LINTED())”注释时要特别小心,因为它可以掩盖实际问题。使用NOTE时,还包括#include。有关更多信息,请参阅lint手册页。