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) 手册页。