Solaris(64 位)开发者指南

用于 32 位和 64 位环境的 lint

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