lint(1) は、32 ビットコードおよび 64 ビットコードの両方に使用することができます。32 ビット環境および 64 ビット環境の両方で実行するコードには、-errchk=longptr64 オプションを使用します。-errchk=longptr64 オプションは、ロング整数とポインタのサイズが 64 ビットで、かつ普通の整数が 32 ビットである環境への移植性を調べるのに使用します。
-Xarch=v9 オプションは、64 ビット SPARC 環境で実行するコードに対して lint を実行する場合に使用します。64 ビット SPARC 上で実行するコードに対して、発生する可能性がある 64 ビット関連の問題について警告を表示するようにするには、-Xarch=v9 オプションと共に -errchk=longptr64 オプションを使用します。
lint には -D__sparcv9 オプションを使用しないでください。
警告がある場合、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*/ コメントは、実際に問題がある場合にもそれを検出しないようにするので、使用する際は十分に注意してください。詳細は、『C ユーザーズガイド』または lint(1) のマニュアルページを参照してください。