我即将把大规模的应用程序移植到64位,我注意到在networking上有一些文章显示了这个移植的许多陷阱,我想知道是否有任何工具可以协助移植到64位,意思是find代码中需要改变的地方….也许海湾合作委员会的警告启用…是不够好? 有更好的吗 ?
编辑:伙计们我正在寻找一个工具,如果有可能是一个完整的编译器,我知道海湾合作委员会可以asist,但我怀疑它会发现所有不可移植的问题,
将在运行时被发现….也许静态代码分析工具,强调移植到64位?
谢谢
这是一个指南。 另一个
在32位和64位操作系统中,某些数据类型的大小是不同的,因此请检查代码假定数据类型大小的地方。 例如,如果您将一个指针指向一个int,那么在64位中不起作用。 这应该解决大部分问题。
如果您的应用程序使用第三方库,请确保它们在64位上也能正常工作。
一个好的工具叫做grep 😉
grep -nH -e '\<int\>\|\<short\>\|\<long\>' *
并用适当的一个替换这些基本整数类型的所有裸用途:
size_t uintptr_t prtdiff_t uintN_t 等等,我可能会忘记一些。 然后 gcc合作委员会的所有警告将告诉你。 你也可以使用clang作为编译器,它可以提供更多的诊断信息。
首先,为什么要“移植”?
考虑到大多数发行版在十多年前已经愉快地提供了32位和64位的变体。 所以除非你以真正不可移动的方式进行编程(而你几乎不得不去尝试),否则你应该没问题。
那么在64位操作系统中编译项目呢? gcc编译器看起来像这样的工具:)
这是一个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值保留规则允许在无符号整数类型的表达式中扩展有符号整数值的符号。 如果要检查打算在Solaris 64位SPARC或x86 64位环境中运行的代码,请使用lint的-m64选项。 当lint生成警告时,它将打印出有问题的代码的行号,描述问题的消息以及是否涉及指针。 该警告消息还指示涉及的数据类型的大小。 当你知道一个指针被涉及,你知道数据类型的大小,你可以找到特定的64位问题,并避免32位和更小的类型之间的预先存在的问题。 您可以通过在上一行中放置“NOTE(LINTED())”形式的注释来抑制给定代码行的警告。 当你想让lint忽略特定的代码行,比如强制转换和赋值时,这很有用。 当你使用“NOTE(LINTED())”注释时要格外小心,因为它可以掩盖真正的问题。 当你使用NOTE时,还包括#include。 有关更多信息,请参阅lint手册页。