lint コマンド

目的

C 言語プログラムに潜在する問題がないかどうかをチェックします。

構文

lint [ -a ] [ -b ] [ -c ] [ -C ] [ -h ] [ -lKey ] [ -n ] [ -oLibrary ] [ -qDBCS ] [ -p ] [ -t ] [ -u ] [ -v ] [ -w Class [Class ... ] ] [ -x ] [ -MA ] [ -NdNumber ] [ -NlNumber ] [ -NnNumber ] [ -NtNumber ] [ -IDirectory ] [ -DName [=Definition ] ] [ -UName ] File ...

説明

lint コマンドは、コーディング・エラーや構文エラー、および不十分なコードや移植性のないコードがないかどうか、C および C++ 言語ソース・コードを検査します。 このプログラムは次の目的に使用できます。

  • ソース・コードとライブラリーの間の非互換性を識別する。
  • コンパイラーよりも厳しいタイプ検査の規則を適用する。
  • 変数の発生可能な問題を識別する。
  • 関数の発生可能な問題を識別する。
  • フロー制御の問題を識別する。
  • 不十分であるか、またはエラーを起こす可能性のある有効な構造体を識別する。
  • 未使用の変数と関数宣言を識別する。
  • 移植性がない可能性のあるコードを識別 する。

    注: lint コマンドで C++ 言語ファイルを検査するには、 C Set++ コンパイラー・パッケージがなければなりません。

ファイル間で使用する関数を検査し、ある場合には値を戻すが、ある場合には戻さない関数や、数やタイプが変化する引数で呼び出す関数、使われない値を持つ関数や、使われても戻さない値を持つ関数などを見つけます。

lint コマンドは、ファイル名の拡張子を次のように解釈します。

  • .c で終わる File 名は、C 言語のソース・ファイルである。
  • .C で終わる File 名は、C++ 言語のソース・ファイルである。
  • .ln で終わる File 名は、-c フラグ、または -o フラグが使われるときに lint コマンドが作成する非 ASCII ファイルである。

lint コマンドは他の接尾部を持つファイルについて警告し、それらを無視します。

lint コマンドは、すべての .c ファイル、.C ファイル、.ln ファイル、および -l フラグで指定したライブラリーを取り込み、それらをコマンド・ラインに現れる順に処理します。 デフォルトでは、lint コマンドは標準の llib-lc.ln lint ライブラリーをファイルのリストの終わりに追加します。 しかし、ユーザーが -p フラグを選べば、lint コマンドは llib-port.ln の移植性のあるライブラリーを使います。 デフォルトでは、相互のファイル間に互換性があるかどうかについて、lint の 2 回目のパスがこのリストを検査します。 しかし、-c フラグを指定すると、.lnllib-lx.ln ファイルは無視されます。

-c フラグと -o フラグを使うと、1 組の C および C++ 言語のソース・ファイル上で lint コマンドの使用を段階的に増やすことができます。 一般に、各ソース・ファイルに対して 1 回は、-c フラグと共に lint コマンドを使ってください。 これらを実行するたびに、.c ファイルに対応する .ln ファイルが作成され、そのソース・ファイルに関するすべてのメッセージが書き込まれます。 lint コマンドをすべてのソース・ファイルに対して別々に実行した後、もう一度 -c フラグなしで実行し、必要な -l フラグを付けてすべての .ln ファイルをリストしてください。 すると、すべてのファイルの間の矛盾が書き込まれます。 このプロシージャーは make コマンドを使うと正常に動作します。 make コマンドは、前回検査された後に変更されたソース・ファイル上でのみ lint コマンドを実行させます。

プリプロセッサー記号 lint および LINT は、問題のあるコードを変更または除去するために lint コマンド用に定義されています。 したがって、記号 lintLINTlint で検査する予定のすべてのコードに対する予約語として考える必要があります。

C および C++ 言語のソース・プログラムに次のコメントを入れると、ソース・プログラムを検査するときに、lint コマンドの動作方法が変化します。

項目 説明
/*NOTREACHED*/ 到達不能コードについてのコメントを抑制します。
/*VARARGSNumber*/ 次の古いスタイルの関数宣言が、引数の数の変化を検査するのを抑制します。 最初の Number 引数のデータ・タイプは検査します。 Number の値を含めないと、lint コマンドは引数を検査しません (Number=0)。 ANSI の関数プロトタイプでは省略符号を使って、このコメントの機能ではなく、指定されていないパラメーターを示さなければなりません。
/*ARGSUSED*/ 関数定義内で使われない関数パラメーターについての警告を抑制します。
/*LINTLIBRARY*/ このコメントをファイルの先頭に置くと、lint コマンドはファイル内の未使用の関数と関数パラメーターを識別しません。 これは、lint コマンドをライブラリー上で実行するときに使います。
/*NOTUSED*/ ファイル内の未使用の外部シンボル、関数および関数パラメーターについて、発生位置から警告し始めるのを抑制します。 /*LINTLIBRARY*/ コメント指示語のスーパーセットですが、外部シンボルにも適用します。 これは、未使用の関数プロトタイプやその他の外部オブジェクト宣言についての警告を抑制するときに使用されます。
/*NOTDEFINED*/ ファイル内の未定義の使用済み外部シンボルおよび関数について、発生位置から警告し始めるのを抑制します。
/*LINTSTDLIB*/ 関数プロトタイプ宣言を関数定義として表示させて、標準のプロトタイプ検査ライブラリーがヘッダー・ファイルから作られるようにします。 この指示語は暗黙に /*NOTUSED*//*LINTLIBRARY*/ のコメント指示語を始動して警告ノイズ・レベルを減少させます。

lint コマンドの警告メッセージにはファイル名と行番号が表示されます。 各ファイルが最初のパスを追加すると、各ファイルと各行番号についての警告が報告されます。

-c フラグを指定しないと、lint コマンドはすべての入力ファイルから情報を収集し、その整合性について検査します。 この時点で、メッセージ・ステムが与えられたソース・ファイルからのものか、またはそのインクルード・ファイルからのものかが分からないときは、lint コマンドはソース・ファイル名の後に疑問符を付けて示します。

多数の標準ヘッダー・ファイルが入っている ANSI プログラムでは、-wD フラグを設定して未使用のプロトタイプについての警告を減らそうとしたり、-n フラグを設定して ANSI 標準ライブラリーに対する検査を使用不可にしようという試みがなされます。 非 ANSI プログラムの場合には、-wk フラグを指定して、関数プロトタイプがないときにもあまり頻繁に警告しないようにします。

フラグ

項目 説明
-a long 値を long ではない変数に代入するときのメッセージを抑制します。
-b 到達不能な break ステートメントについてのメッセージを抑制します。
-c lint コマンドによって、コマンド・ライン上の .c ファイルごとに .ln ファイルが 1 個ずつ作成されるようにします。 これらの .ln ファイルは lint コマンドの最初のパスによって作成され、関数間の互換性については検査されません。
-C (/usr/lpp//xlC/lib ディレクトリーにある) C++ ライブラリーの使用を指定します。
-h バグや不適当なスタイルを検出したり、無駄を省く試みは行われません。
-lKey 追加の llib-lKey.ln lint ライブラリーが含まれます。 ユーザーは、コマンド・ラインで -lm を指定して、llib-lm.ln 数学ライブラリーの lint バージョンを含めるか、または、コマンド・ラインで -ldos フラグを指定して、llib-ldos.ln ライブラリーの lint バージョンを含めることができます。 多数のファイルを持つプロジェクトの一部としてファイルを検査する場合に、ローカル lint ライブラリーを含めるためにこのフラグを使います。 このフラグを指定すると、lint コマンドでの llib-lc.ln ライブラリーの使用が制限されません。 lint ライブラリーは /usr/ccs/lib ディレクトリー内になければなりません。
-n 標準ライブラリー、または移植性のある lint ライブラリーと互換性があるかどうかを検査することを抑制します。 この抑制は ANSI ライブラリーと拡張モード・ライブラリーの両方に適用します。
-oLibrary lint コマンドによって llib-lLibrary.ln lint ライブラリーが作成できるようにします。 -c フラグを指定すると、-o フラグは無効になります。 作成された lint ライブラリーは lint コマンドの 2 回目のパスに与えられる入力です。 -o フラグは、単にこのファイルが指定された lint ライブラリーに保管されるようにします。 外部からのメッセージなしに llib-lLibrary.ln を作成するには、-x フラグを使います。 lint ライブラリー用のソース・ファイルが単に外部インターフェース (例えば、llib-lc ファイルが書き込まれる方法) である場合は、-v フラグが有用です。 また、これらのフラグ設定は lint コマンドのコメント行を使うと使用できるようになります。
-p 他の C 言語への移植性が検査されます。
-t 32 ビットから 64 ビットに移植するときに、問題のある割り当てを検査します。 次のケースのみを検査します。
  • 32 ビットで正常に動作する一部の操作が 64 ビットでは問題を起こす場合があるので、すべてのシフト/マスク操作にはフラグが付けられます。
  • 割り当ての次のタイプに警告を与えます。
    int = long
    int = ptr
-u 使用されているが定義されていない、または定義されているが使用されていない関数や外部変数について、メッセージが表示されるのを抑制します。 より大きなプログラムのファイルのサブセット上で lint コマンドを実行するには、このフラグを使います。
-v 使用されない関数パラメーターについて、メッセージが表示されるのを抑制します。
-w Class [Class...] 警告クラスの報告を制御します。 すべての警告クラスはデフォルトではアクティブですが、Class 引数の一部として適切なオプションを含めることによって、個別に非アクティブにできます。 個々のオプションは次のとおりです。
a
非 ANSI 機能
c
符号なしの値との比較
d
宣言の整合性
h
発見的手法欠陥
k
K+R タイプのソース・コードを使用
l
long 値を long ではない変数へ代入
n
ヌル効果コード
o
未知の評価の順序
p
各種移植性に関すること
r
リターン・ステートメントの整合性
s
ストレージ容量の検査
u
変数と関数の適切な使用方法
A
すべての警告を非アクティブにする
C
条件で発生する定数
D
外部宣言がまったく使用されない
O
使用されなくなった機能
P
関数プロトタイプが存在する
R
到達不能コードの検出
-x まったく使用されない外部宣言を持つ変数について、メッセージが表示されるのを抑制します。
-MA ANSI C 言語標準規則を実施します。 デフォルトのモードは拡張 C モードと同じです。 ANSI モードはデフォルトの拡張モード C lint ライブラリーの代わりに標準 ANSI ライブラリー関数プロトタイプを前に付加します。 ANSI モードはより厳密なファイル間オブジェクト参照を実施し、定義リンケージ検査を行います。
-NdNumber 寸法テーブルのサイズを Number に変更します。Number 値のデフォルトは 2000 です。
-NlNumber タイプ・ノードの数を Number に変更します。Number 値のデフォルトは 8000 です。
-NnNumber 記号テーブルのサイズを Number に増加します。 Number 値のデフォルトは 1500 です。
-NtNumber ツリー・ノードの数を Number に変更します。Number 値のデフォルトは 1000 です。

また、lint コマンドは次の cpp コマンド (マクロ・プリプロセッサー) のフラグを認識します。

項目 説明
-I Directory ディレクトリーのリストに Directory を追加します。 lint コマンドはこのディレクトリー内で #include ファイルを検索します。
-DName[=Definition] #define ファイルが定義するように、Name を定義します。 Definition のデフォルト値は 1 です。
-qDBCS 現行ロケールによって指定されたマルチバイト・モードを設定します。
-U Name Name から初期の定義を除去します。 ここで、Name は特定のプリプロセッサーによって定義された予約シンボルです。

終了状況

このコマンドは次の終了値を戻します。

項目 説明
0 正常終了。
>0 エラーが発生しました。

  1. C プログラムのエラーを検査するには、次のように入力します。
    lint command.c
  2. 一部のメッセージの表示を抑制するには、次のように入力します。
    lint -v -x program.c
    これは program.c を検査しますが、未使用の関数パラメーター (-v)、または未使用の外部記号 (-x) についてエラー・メッセージを表示しません。
  3. 追加の lint ライブラリーに対してプログラムを検査するには、次のように入力します。
    lint -lsubs program.c
    これは program.c/usr/ccs/lib/llib-lc.ln 標準 lint ライブラリーおよび /usr/lib/llib-lsubs.ln lint ライブラリーに対して検査します。
  4. 移植可能ライブラリー、追加のライブラリーに対して検査するには、次のように入力します。
    lint -lsubs -p program.c
    これは program.c/usr/ccs/lib/llib-port.ln 移植可能 lint ライブラリーおよび /usr/lib/llib-lsubs.ln lint ライブラリーに対して検査します。
  5. 非標準ライブラリーに対してのみ検査するには、次のように入力します。
    lint -lsubs -n program.c
    これは program.c /usr/lib/llib-lsubs.ln に対してのみ検査します。

ファイル

項目 説明
/usr/lib/lint[12} プログラム
/usr/ccs/lib/llib-lansi 標準 ANSI 関数の宣言 (ソース)
/usr/ccs/lib/llib-lansi.ln 標準 ANSI 関数の宣言 (バイナリー・フォーマット)
/usr/ccs/lib/llib-lc 標準関数の宣言 (ソース)
/usr/ccs/lib/llib-lc.ln 標準関数の宣言 (バイナリー・フォーマット)
/usr/ccs/lib/llib-lcrses curses 関数の宣言 (ソース)
/usr/ccs/lib/llib-lcrses.ln curses 関数の宣言 (バイナリー・フォーマット)
/usr/ccs/lib/llib-lm 標準数学関数の宣言 (ソース)
/usr/ccs/lib/llib-lm.ln 標準数学関数の宣言 (バイナリー・フォーマット)
/usr/ccs/lib/llib-port 移植可能な関数の宣言 (ソース)
/usr/ccs/lib/llib-port.ln 移植可能な関数の宣言 (バイナリー・フォーマット)
/usr/lpp//xlC/lib C++ ライブラリーが入っているディレクトリー
/var/tmp/*lint* 一時ファイル