LINT(1)

名称
lint - C プログラムの検証を行う

書式
lint [-abceghprvwxzHFV] [-s | -t] [-i | -nu] [-D name[=def]] [-U name] [-I directory] [-d directory] [-L directory] [-l library] [-o outputfile] [-B directory] [-X id[,id ...]] file ... lint [-abceghprvwzHFV] [-s | -t] -C library [-D name[=def]] [-U name] [-I directory] [-d directory] [-B directory] [-X id[,id ...]] file ...

解説
lint ユーティリティは、指定された C のプログラムファイルを解析し、 バグの可能性がある部分、 移植性がないと考えられる部分、 あるいは無駄なコードと考えられる部分 の検出を試みます。 加えて、 lint ユーティリティは、C コンパイラより厳密な型チェックを行います。 lint は最初のフェーズでシンボル “lint” を定義して C プリプロセッサを起動します。 これにより、ある疑わしいコード部分を lint に変更あるいはスキップさせることができます。 それゆえ、 lint がチェックする全てのコードにおいては、シンボル lint は予約語とみなすべきです。

現在 lint が指摘する問題点は以下のものです。 到達しない文、 先頭から入らないループ、 宣言したものの使用しない変数、 定数値となる論理式。 関数呼び出しに関しては以下のような矛盾点が指摘されます。 あるところでは値を返すが別の場所では値を返さない関数の呼び出し、 引数の個数が変化する関数の呼び出し、 関数側で想定していない型の引数を渡す関数呼び出し、 返値を使用しない関数呼び出し、 返値のない関数の存在しない返値を使用している関数呼び出し。

ファイル名引数のうち、末尾が.c で終わるものは C のソースファイルとみなされます。 ファイル名が .ln で終わるものは、以前 lint を -i, -o あるいは -C オプション付きで起動した際の結果を格納したファイルとみなされます。 .ln ファイルは、 cc(1) が.c から生成するオブジェクトファイル.o に相当します。 lint ユーティリティはまた、 -l オプションによって指定された特別なライブラリを受け付けます。 これは、ライブラリ関数と変数の定義を含むものです。

lint ユーティリティは、全ての .c, .ln ファイルと llib-llibrary.ln (lint ライブラリ) ファイルを受け取り、 それらをコマンドラインで指定した順に処理します。 デフォルトでは、 lint は標準 C lint ライブラリ (llib-lc.ln) をファイルリストの最後に付け加えます。 -i オプションが指定されていれば、 .ln ファイルは無視されます。 また、 -o オプションあるいは -i オプションが指定されていれば、 llib-llibrary.ln ファイルは無視されます。 -i オプションが指定されて いなければ、 lint の 2番目の パスでこのファイルリストが相互一貫性チェックに用いられます。 このとき、 もし問題箇所が与えられたソースファイルからではなく インクルードファイルのひとつに端を発するものならば、 表示されるソースファイル名の後ろに疑問符が付けられます。

特別な入力ファイル名 “-” は、 lint に (ファイルの終端まで) 標準入力から入力を取らせ、これを.c ファイルとして処理させます。 -i フラグが指定され “-” が入力ファイルの 1 個として指定された場合、出力ファイル名を指定するために -o フラグもまた指定される必要があります。 オプションは次の通りです:

-a  long 型以外の変数に対する long 値の代入を報告します。

-aa -a に加え、 小さい型への暗黙の型変換を引き起こす あらゆる 整数値代入を報告します。

-b  到達し得ない break 文を報告します。 このオプションはデフォルトでは有効ではありません。 なぜなら、ほとんどの lex(1) および多くの yacc(1) 出力はこのような break を数多く含むからです。

-c  移植性に問題のあるキャストについて報告します。

-e  enum 型に対する不正操作や enum 型と 整数 型間の組み合わせについて報告します。

-g  gcc(1) が C 言語に対して行っているいくつかの拡張機能についての警告を抑制します。 現在のところ、これに該当するのは以下のものです。 自動変数の集合型初期化式に現れる非定数式、 void 型へのポインタに対する算術操作、 enum 宣言の最後のコンマ、 C++ スタイルの “//” コメント、 サイズが 0 の構造体、 左辺値でない配列の添字付け、 旧形式の関数宣言を無効化するプロトタイプ宣言、 long long 整数型。 -g オプションはまた、キーワード asm および inline を有効にします ( asm および inline の先頭にアンダスコアを付けたキーワードは 常に利用可能です)。

-h  いくつかの発見的テストを適用して バグを発見し、スタイルを洗練し、無駄を省くことを試みます。

-i  コマンドラインの各.c ファイルに対して .ln ファイルを生成します。 これらの .ln ファイルは lint の最初のパスの結果に過ぎず、 関数間の一貫性チェックは行われません。

-n  標準ライブラリに対する一貫性チェックを行いません。

-p  他の C 方言への移植性に関するチェックを試みます。

-r  重複した宣言が見つかった場合、前回の宣言の位置を報告します。

-s  厳密な ANSI C モードでチェックします。 ANSI C で必要とされる警告およびエラーを出力します。 従来の C と ANSI C とで異なる振る舞いをする構造に対しての警告は行いません。 -s オプション指定時は、 プリプロセッサマクロとして __STRICT_ANSI__ が定義されます。

-t  従来の C モードでチェックします。 このモードでは __STDC__ は定義されません。 従来の C で許可されない構造に対して警告が出力されます。 従来の C と ANSI C とで異なる振る舞いをする構造に対しての警告は抑制されます。 マシンタイプ (例: sun3) およびマシンアーキテクチャ (例: m68k) を記述したプリプロセッサマクロは、 先頭および末尾のアンダスコア無しで定義されます。 キーワード const, volatile および signed は従来の C モードでは利用できません (しかし、先頭にアンダスコアを 付したもう一方のキーワードは依然利用可能です)。

-u  使用されているが定義されていない、あるいは定義されているが使用されていない 関数および外部変数についての報告を行いません (この機能は、大規模プログラムを構成する一部のファイルに対して lint を走らせる場合に向いています)。

-v  関数中の未使用引数に関する報告を抑制します。

-x  extern 宣言で参照されているが一度も使用されていない変数について報告します。

-z  定義されていない構造体に関する報告を抑制します (例えば、中身を関知せずに構造体へのポインタを用いる場合など)。

-B path
    バイナリ lint1 と lint2 を検索するために使用するパスです。 デフォルトは /usr/libexec です。

-C library
    llib-llibrary.ln という名前の lint ライブラリを作成します。 このライブラリは、全ての入力ファイル.c および .ln から作られます。 これらのファイルに含まれる全ての大域関数および大域変数の宣言が 新しく作られるライブラリに書き出された後、 lint は -l オプションで指定されたライブラリを含めた全ての入力ファイルに対して 相互一貫性のチェックを行います。

-D name[=def]
    cpp(1) のために #define ディレクティブと同様にしてマクロ name を定義します。 右辺値が指定されない場合、マクロ name は 1 と定義されます。

-I directory
    インクルードファイルを検索するディレクトリリストに directory を追加します。

-d directory
    インクルードファイルを検索するデフォルトの場所を /usr/include の代りに directory にします。

-l library
    lint ライブラリ llib-llibrary.ln をインクルードします。

-L directory
    lint ライブラリを標準の場所から探す前に、 directory および directory/lint の中を探します。

-F  ファイルのパス名全体を表示します。 lint ユーティリティは通常、パスを除いたファイル名だけを表示します。

-H  もし問題箇所がインクルードファイルに端を発するものならば、 lint はソースファイル名と それに続く疑問符に代えて インクルードファイル名を表示します。

-o outputfile
    出力ファイル名を outputfile とします。 出力ファイルは lint の2番目のパスの入力ファイルとなるものです。 -o オプションは単に、このファイルを指定された名前でファイルに保存します。 同時に -i オプションも指定されていれば、これらのファイルは一貫性をチェックされません。 llib-llibrary.ln ファイルを作成する際には、余分なメッセージを抑制するため、 -u オプションの使用を推奨します。 lint ライブラリのソースファイルが単に外部インタフェースに過ぎない場合は、 -v オプションを用いると便利です。

-U name
    プリプロセッサが定義する全てのマクロ name を取り除きます。

-V  制御プログラムが C プリプロセッサおよび lint の第1 および第2 パスを実行する際のコマンドラインを表示します。

-w  警告をエラーとして扱います。

-X id[,id ...]
    id で指定されるエラーメッセージを抑制します。 メッセージと id のリストは lint(7) を参照してください。

  入力文法
lint の第 1 パスは標準的な C ソースファイルを読み込みます。 lint ユーティリティは以下のような C のコメントをコマンドとして認識します。

/* ARGSUSEDn */
    最初の n 個の引数に対してのみ使用チェックを行います。 n を省略すると 0 と解釈されます (このオプションは、次の関数に対して -v オプションと同様の働きをします)。

/* BITFIELDTYPE */
    型が整数の場合、 不正なビットフィールド型に関するエラーメッセージを抑制します。 また、可搬性の無いビットフィールド型の警告を抑制します。

    /* CONSTCOND */ 又は /* CONSTANTCOND */ 又は /* CONSTANTCONDITION */ 次の式に対する定数オペランドに関する報告を抑制します。

    /* FALLTHRU */ 又は /* FALLTHROUGH */ case あるいは default ラベルのついた文への fall through に関する報告を抑制します。 このディレクティブはそれらのラベルの直前に置く必要があります。

/* LINTLIBRARY */
    ファイル先頭で、このファイル中で定義される全ての関数および変数が 使用されている とマークします。 また、未使用の関数引数に関する報告も行いません。

    /* LINTED [comment] */ 又は /* NOSTRICT [comment] */ 未使用の変数あるいは関数に関するものを除き、 ファイル内に閉じた問題点に関する警告を抑制します。 このディレクティブは、 lint 警告が発生する場所の直前の行に置く必要があります。

/* LONGLONG */
    long long 整数型の使用に関する報告を抑制します。

/* NOTREACHED */
    しかるべき場所において、未到達コードに関する報告を抑制します (このコメントは通常、 exit(3) のような関数の呼び出しの直後に置きます)。

/* PRINTFLIKEn */
    lint は最初の (n-1) 個の引数を普通にチェックします。 n 番目の引数は printf(3) のフォーマット文字列と同様に解釈され、 残りの引数をチェックするために用いられます。

/* PROTOLIBn */
    もし n が 0 でなければ、 lint は関数宣言プロトタイプを関数宣言として取り扱います。 このディレクティブは /* LINTLIBRARY */ と共にのみ用いることができます。 n が 0 の場合は、関数プロトタイプは通常通り取り扱われます。

/* SCANFLIKEn */
    lint は最初の (n-1) 個の引数を普通にチェックします。 n 番目の引数は scanf(3) のフォーマット文字列と同様に解釈され、 残りの引数をチェックするために用いられます。

/* VARARGSn */
    後続する関数宣言において、引数個数に関する通常のチェックを抑制します。 最初の n 個の引数のデータ型がチェックされます。 n が指定されない場合は 0 と解釈されます。

-i オプションおよび -o オプションを用いると、ひと組の C ソースファイルに対して インクリメンタルに lint を適用することが可能です。 一般に、各ソースファイルに対して -i オプション付きで lint を一度起動します。 このとき、.c に対応して .ln ファイルが作成され、 それらのソースファイルに関する全てのメッセージが表示されます。 全てのソースファイルに対して個別の lint 処理が済んだ後、全ての .ln ファイルと必要な -l library オプションを付け、( -i オプション無しで) もう一度 lint を起動します。 ここでファイル間の一貫性に関する問題点が表示されます。 この方式は make(1) を用いるとうまくいきます。 make(1) を用いると、 前回ソースファイルの組が lint された後、修正のあったファイルに対してのみ lint を起動することができます。

環境変数

LIBDIR
    -l library オプションで指定されたライブラリが存在するディレクトリ。 この環境変数が定義されていない場合は、ライブラリ検索のために デフォルトパスとして /usr/libdata/lint が用いられます。

TMPDIR
    一時ファイル用のパスは通常、この環境変数をセットすることで変更できます。

CC  C コンパイラプログラムの場所。 デフォルトは /usr/bin/cc です。

関連ファイル
/usr/libexec/lint[12]
    プログラム
/usr/libdata/lint/llib-l*.ln
    前もって作成されている様々な lint ライブラリ
/tmp/lint*
    一時ファイル

関連項目
cc(1), cpp(1), make(1)

作者
Jochen Pohl

バグ

exit(3) や longjmp(3) および戻って来ない他の関数は正しく理解されません。 これらは様々な不正診断の原因となります。

最初の extern 宣言の前でのみ用いられる static 関数は、 未使用であると報告されます。

-o オプションによって作られたライブラリは、のちの lint 実行で用いた場合、 ライブラリ作成時に報告されたある種のエラーが再度報告され、 ライブラリ作成時に用いたオリジナルのソースファイルの行番号およびファイル名が エラーメッセージ中に表示されることがあります。 そのため、lint ライブラリ作成には -C オプションを用いることを推奨します。