Sun Studio 10 编译器中提供的 lint 程序可以检测潜在的 64 位问题,并有助于使代码对于 64 位安全。此外,该 C 编译器的 -v 选项也会非常有用。该选项可指示编译器执行更严格的附加语义检查,还会针对指定的文件启用某些与 lint 相似的检查。
有关 C 编译器和 lint 的功能的更多信息,请参见《Sun Studio 10: C User's Guide》。
lint 既可用于 32 位代码又可用于 64 位代码。 对于要在 32 位和 64 位环境中运行的代码,请使用 -errchk=longptr64 选项。-errchk=longptr64 选项用于检查是否可将代码移植到长整数和指针的长度为 64 位、无格式整数的长度为 32 位的环境中。
对于要在 64 位 SPARC 环境中运行的 lint 代码,应当使用 -Xarch=v9 选项。将 -errchk=longptr64 选项和 -Xarch=v9 选项一起使用,可以针对要在 64 位 SPARC 上运行的代码生成有关潜在 64 位程序问题的警告。
从 Solaris 10 发行版开始,对于要在 64 位 AMD 环境中运行的 lint 代码,应当使用 -Xarch=amd64 选项。
lint 的 -D__sparcv9 选项已不再需要,不应当再使用。
有关 lint 选项的说明,请参见《Sun Studio 10: C User's Guide》。
生成警告时,lint(1) 会列显违例代码的行号、描述问题的警告消息以及是否涉及指针的注释。它还会指明所涉及类型的长度。如果确定涉及指针并且知道数据类型的长度,则会便于查找特定的 64 位问题,并避免 32 位和更短类型之间的已有问题。
尽管 lint 会给出有关潜在的 64 位问题的警告,但也无法检测所有的问题。请务必牢记,在 lint 生成的警告中,并非所有警告都是真正的 64 位问题。在许多情况下,符合应用程序意图并且正确无误的代码也会生成警告。
以下的程序和 lint(1) 输出样例说明了非纯 64 位代码中可能出现的大多数 lint 警告。
1 #include <inttypes.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 static char chararray[] = "abcdefghijklmnopqrstuvwxyz"; 6 7 static char *myfunc(int i) 8 { 9 return(& chararray[i]); 10 } 11 12 void main(void) 13 { 14 int intx; 15 long longx; 16 char *ptrx; 17 18 (void) scanf("%d", &longx); 19 intx = longx; 20 ptrx = myfunc(longx); 21 (void) printf("%d\n", longx); 22 intx = ptrx; 23 ptrx = intx; 24 intx = (int)longx; 25 ptrx = (char *)intx; 26 intx = 2147483648L; 27 intx = (int) 2147483648L; 28 ptrx = myfunc(2147483648L); 29 } (19) warning: assignment of 64-bit integer to 32-bit integer (20) warning: passing 64-bit integer arg, expecting 32-bit integer: myfunc(arg 1) (22) warning: improper pointer/integer combination: op "=" (22) warning: conversion of pointer loses bits (23) warning: improper pointer/integer combination: op "=" (23) warning: cast to pointer from 32-bit integer (24) warning: cast from 64-bit integer to 32-bit integer (25) warning: cast to pointer from 32-bit integer (26) warning: 64-bit constant truncated to 32 bits by assignment (27) warning: cast from 64-bit integer constant expression to 32-bit integer (28) warning: passing 64-bit integer constant arg, expecting 32-bit integer: myfunc(arg 1) function argument ( number ) type inconsistent with format scanf (arg 2) long * :: (format) int * t.c(18) printf (arg 2) long :: (format) int t.c(21)
(仅当常量表达式不适合它所强制转换到的类型时,才会发出从以上代码样例的第 27 行中生成的 lint 警告。)
通过在上一行中加一个 /*LINTED*/ 注释,可以禁止对给定的源代码行发出警告。如果确实要让代码以特定方式运行(例如强制类型转换和赋值)时,这种做法会很有用。使用 /*LINTED*/ 注释时请务必谨慎,因为它可能会掩盖真实问题。有关更多信息,请参阅《Sun Studio 10: C User's Guide》或 lint(1) 手册页。