.\" %NetBSD: lint.1,v 1.3 1995/10/23 13:45:31 jpo Exp % .\" .\" Copyright (c) 1994, 1995 Jochen Pohl .\" All Rights Reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by Jochen Pohl for .\" The NetBSD Project. .\" 4. The name of the author may not be used to endorse or promote products .\" derived from this software without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" %FreeBSD: src/usr.bin/xlint/xlint/lint.1,v 1.8.2.5 2001/08/16 13:17:15 ru Exp % .\" .\" $FreeBSD: doc/ja_JP.eucJP/man/man1/lint.1,v 1.10 2001/05/14 01:07:25 horikawa Exp $ .Dd August 28, 1994 .Dt LINT 1 .Os .Sh 名称 .Nm lint .Nd C プログラムの検証を行う .Sh 書式 .Nm .Op Fl abceghprvxzHFV .Op Fl s Ns | Ns Fl t .Op Fl i Ns | Ns Fl nu .Op Fl D Ns Ar name Ns Op =def .Op Fl U Ns Ar name .Op Fl I Ns Ar directory .Op Fl L Ns Ar directory .Op Fl l Ns Ar library .Op Fl o Ns Ar outputfile .Ar .Nm .Op Fl abceghprvzHFV .Op Fl s Ns | Ns Fl t .Fl C Ns Ar library .Op Fl D Ns Ar name Ns Op =def .Op Fl I Ns Ar directory .Op Fl U Ns Ar name .Ar .Sh 解説 .Nm は指定された C のプログラムファイルを解析し、 バグの可能性がある部分、 移植性がないと考えられる部分、 あるいは無駄なコードと考えられる部分 の検出を試みます。 加えて、 .Nm は C コンパイラより厳密な型チェックを行います。 .Nm は最初のフェーズでシンボル .Sy lint を定義して C プリプロセッサを起動します。 これにより、ある疑わしいコード部分を .Nm に変更あるいはスキップさせることができます。 それゆえ、 .Nm がチェックする全てのコードにおいては、シンボル .Sy lint は予約語とみなすべきです。 .Pp 現在 .Nm が指摘する問題点は以下のものです。 到達しない文、 先頭から入らないループ、 宣言したものの使用しない変数、 定数値となる論理式。 関数呼び出しに関しては以下のような矛盾点が指摘されます。 あるところでは値を返すが別の場所では値を返さない関数の呼び出し、 引数の個数が変化する関数の呼び出し、 関数側で想定していない型の引数を渡す関数呼び出し、 返値を使用しない関数呼び出し、 返値のない関数の存在しない返値を使用している関数呼び出し。 .Pp ファイル名引数のうち、末尾が .Pa \&.c で終わるものは C のソースファイルとみなされます。 ファイル名が .Pa \&.ln で終わるものは、以前 .Nm を .Fl i , .Fl o あるいは .Fl C オプション付きで起動した際の結果を格納したファイルとみなされます。 .Pa \&.ln ファイルは、 .Xr cc 1 が .Pa \&.c から生成するオブジェクトファイル .Pa \&.o に相当します。 .Nm はまた、 .Fl l オプションによって指定された特別なライブラリを受け付けます。 これは、ライブラリ関数と変数の定義を含むものです。 .Pp .Nm は全ての .Pa \&.c , \&.ln ファイルと .Pa llib-l Ns Ar library Ns Pa \&.ln (lint ライブラリ)ファイルを受け取り、 それらをコマンドラインで指定した順に処理します。 デフォルトでは、 .Nm は標準 C lint ライブラリ .Pq Pa llib-lc.ln をファイルリストの最後に付け加えます。 .Fl i オプションが指定されていれば、 .Pa \&.ln ファイルは無視されます。 また、 .Fl o オプションあるいは .Fl i オプションが指定されていれば、 .Pa llib-l Ns Ar library Ns Pa \&.ln ファイルは無視されます。 .Fl i オプションが指定されて .Em いなければ、 .Nm の 2番目の パスでこのファイルリストが相互一貫性チェックに用いられます。 このとき、 もし問題箇所が与えられたソースファイルからではなく インクルードファイルのひとつに端を発するものならば、 表示されるソースファイル名の後ろに疑問符が付けられます。 .Pp .Sy オプション .Bl -tag -width Fl .It Fl a .Sy long 型以外の変数に対する .Sy long 値の代入を報告します。 .It Fl aa .Fl a に加え、 小さい型への暗黙の型変換を引き起こす .Em あらゆる 整数値代入を報告します。 .It Fl b 到達し得ない .Sy break 文を報告します。 このオプションはデフォルトでは有効ではありません。 なぜなら、ほとんどの .Xr lex 1 および多くの .Xr yacc 1 出力はこのような break を数多く含むからです。 .It Fl c 移植性に問題のあるキャストについて報告します。 .It Fl e .Sy enum Ns 型 に対する不正操作や .Sy enum 型と .Sy 整数 型間の組み合わせについて報告します。 .It Fl g .Xr gcc 1 が C 言語に対して行っているいくつかの拡張機能についての警告を抑制します。 現在のところ、これに該当するのは以下のものです。 自動変数の集合型初期化式に現れる非定数式、 void 型へのポインタに対する算術操作、 サイズがゼロの構造体、 左辺値でない配列の添字付け、 旧形式の関数宣言を無効化するプロトタイプ宣言、 long long 整数型。 .Fl g オプションはまた、キーワード .Sy asm および .Sy inline を有効にします ( .Sy asm および .Sy inline の先頭にアンダースコア(`_')を付けたキーワードは 常に利用可能です)。 .It Fl h いくつかの発見的テストを適用して バグを発見し、スタイルを洗練し、無駄を省くことを試みます。 .It Fl i コマンドラインの各 .Pa \&.c ファイルに対して .Pa \&.ln ファイルを生成します。 これらの .Pa \&.ln ファイルは .Nm の最初のパスの結果に過ぎず、 関数間の一貫性チェックは行われません。 .It Fl n 標準ライブラリに対する一貫性チェックを行いません。 .It Fl p 他の C 方言への移植性に関するチェックを試みます。 .It Fl r 重複した宣言が見つかった場合、前回の宣言の位置を報告します。 .It Fl s 厳密な ANSI C モードでチェックします。 ANSI C で必要とされる警告およびエラーを出力します。 従来の C と ANSI C とで異なる振る舞いをする構造に対しての警告は行いません。 .Fl s オプション指定時は、 プリプロセッサマクロとして .Li __STRICT_ANSI__ が定義されます。 .It Fl t 従来の C モードでチェックします。 このモードでは .Li __STDC__ は定義されません。 従来の C で許可されない構造に対して警告が出力されます。 従来の C と ANSI C とで異なる振る舞いをする構造に対しての警告は抑制されます。 マシンタイプ(例: .Li sun3 Ns ) およびマシンアーキテクチャ(例: .Li m68k Ns ) を記述したプリプロセッサマクロは、 先頭および末尾のアンダースコア無しで定義されます。 キーワード .Sy const Ns , .Sy volatile および .Sy signed は従来の C モードでは利用できません(しかし、先頭にアンダースコアを 付したもう一方のキーワードは依然利用可能です)。 .It Fl u 使用されているが定義されていない、あるいは定義されているが使用されていない 関数および外部変数についての報告を行いません (この機能は、大規模プログラムを構成する一部のファイルに対して .Nm を走らせる場合に向いています)。 .It Fl v 関数中の未使用引数に関する報告を抑制します。 .It Fl x .Sy extern 宣言で参照されているが一度も使用されていない変数について報告します。 .It Fl z 定義されていない構造体に関する報告を抑制します (例えば、中身を関知せずに構造体へのポインタを用いる場合など)。 .It Fl C Ns Ar library .Pa llib-l Ns Ar library Ns Pa .ln という名前の .Nm ライブラリを作成します。 このライブラリは、全ての入力ファイル .Pa \&.c および .Pa \&.ln から作られます。 これらのファイルに含まれる全ての大域関数および大域変数の宣言が 新しく作られるライブラリに書き出された後、 .Nm は .Fl l オプションで指定されたライブラリを含めた全ての入力ファイルに対して 相互一貫性のチェックを行います。 .It Fl D Ns Ar name Ns Op =def .Xr cpp 1 のために .Li #define ディレクティブと同様にしてマクロ .Ar name を定義します。 右辺値が指定されない場合、マクロ .Ar name は 1 と定義されます。 .It Fl I Ns Ar directory インクルードファイルを検索するディレクトリリストに .Ar directory を追加します。 .It Fl l Ns Ar library lint ライブラリ .Pa llib-l Ns Ar library Ns Pa \&.ln をインクルードします。 .It Fl L Ns Ar directory lint ライブラリを標準の場所から探す前に、 .Ar directory および .Ar directory Ns Pa /lint の中を探します。 .It Fl F ファイルのパス名全体を表示します。 .Nm は通常、パスを除いたファイル名だけを表示します。 .It Fl H もし問題箇所がインクルードファイルに端を発するものならば、 .Nm はソースファイル名と それに続く疑問符に代えて インクルードファイル名を表示します。 .It Fl o Ns Ar outputfile 出力ファイル名を .Ar outputfile とします。 出力ファイルは .Nm の2番目のパスの入力ファイルとなるものです。 .Fl o オプションは単に、このファイルを指定された名前でファイルに保存します。 同時に .Fl i オプションも指定されていれば、これらのファイルは一貫性をチェックされません。 .Pa llib-l Ns Ar library Ns Pa \&.ln ファイルを作成する際には、余分なメッセージを抑制するため、 .Fl u オプションの使用を推奨します。 lint ライブラリのソースファイルが単に外部インタフェースに過ぎない場合は、 .Fl v オプションを用いると便利です。 .It Fl U Ns Ar name プリプロセッサが定義する全てのマクロ .Ar name を取り除きます。 .It Fl V 制御プログラムが C プリプロセッサおよび .Nm の第1 および第2 パスを実行する際のコマンドラインを表示します。 .El .Pp .Sy 入力文法 .Pp .Nm の第1 パスは標準的な C ソースファイルを読み込みます。 .Nm は以下のような C のコメントをコマンドとして認識します。 .Bl -tag -width Fl .It Li /* ARGSUSED Ns Ar n Li */ 最初の .Ar n 個の引数に対してのみ使用チェックを行います。 .Ar n を省略すると 0 と解釈されます (このオプションは、次の関数に対して .Fl v オプションと同様の働きをします)。 .It Li /* CONSTCOND */ No 又は Xo .Li /* CONSTANTCOND */ No 又は .Li /* CONSTANTCONDITION */ .Xc 次の式に対する定数オペランドに関する報告を抑制します。 .It Li /*\ FALLTHRU\ */ No 又は Xo .Li /* FALLTHROUGH */ .Xc .Sy case あるいは .Sy default ラベルのついた文への fall through に関する報告を抑制します。 このディレクティブはそれらのラベルの直前に置く必要があります。 .It Li /* LINTLIBRARY */ ファイル先頭で、このファイル中で定義される全ての関数および変数が .Em 使用されている とマークします。 また、未使用の関数引数に関する報告も行いません。 .It Li /* LINTED Xo .Op Ar comment .Li */ No 又は .Li /* NOSTRICT .Op Ar comment .Li */ .Xc 未使用の変数あるいは関数に関するものを除き、 ファイル内に閉じた問題点に関する警告を抑制します。 このディレクティブは、lint 警告が発生する場所の直前の行に置く必要があります。 .It Li /* LONGLONG */ long long 整数型の使用に関する報告を抑制します。 .It Li /* NOTREACHED */ しかるべき場所において、未到達コードに関する報告を抑制します (このコメントは通常、 .Xr exit 3 のような関数の呼び出しの直後に置きます)。 .It Li /* PRINTFLIKE Ns Ar n Li */ .Nm は最初の .Pq Ar n Ns No -1 個の引数を普通にチェックします。 .Ar n 番目の引数は .Sy printf のフォーマット文字列と同様に解釈され、 残りの引数をチェックするために用いられます。 .It Li /* PROTOLIB Ns Ar n Li */ もし .Ar n がゼロでなければ、 .Nm は関数宣言プロトタイプを関数宣言として取り扱います。 このディレクティブは .Li /* LINTLIBRARY */ と共にのみ用いることができます。 .Ar n がゼロの場合は、関数プロトタイプは通常通り取り扱われます。 .It Li /* SCANFLIKE Ns Ar n Li */ .Nm は最初の .Pq Ar n Ns No -1 個の引数を普通にチェックします。 .Ar n 番目の引数は .Sy scanf のフォーマット文字列と同様に解釈され、 残りの引数をチェックするために用いられます。 .It Li /* VARARGS Ns Ar n Li */ 後続する関数宣言において、引数個数に関する通常のチェックを抑制します。 最初の .Ar n 個の引数のデータ型がチェックされます。 .Ar n が指定されない場合は 0 と解釈されます。 .El .Pp .Fl i オプションおよび .Fl o オプションを用いると、ひと組の C ソースファイルに対して インクリメンタルに .Nm を適用することが可能です。 一般に、各ソースファイルに対して .Fl i オプション付きで .Nm を一度起動します。 このとき、 .Pa \&.c に対応して .Pa \&.ln ファイルが作成され、 それらのソースファイルに関する全てのメッセージが表示されます。 全てのソースファイルに対して個別の .Nm 処理が済んだ後、全ての .Pa \&.ln ファイルと必要な .Fl l Ns Ar library オプションを付け、( .Fl i オプション無しで)もう一度 .Nm を起動します。 ここでファイル間の一貫性に関する問題点が表示されます。 この方式は .Xr make 1 を用いるとうまくいきます。 .Xr make 1 を用いると、 前回ソースファイルの組が .Nm された後、修正のあったファイルに対してのみ .Nm を起動することができます。 .Sh 環境変数 .Bl -tag -width Fl .It Ev LIBDIR .Fl l Ns Ar library オプションで指定されたライブラリが存在するディレクトリ。 この環境変数が定義されていない場合は、ライブラリ検索のために デフォルトパスとして .Pa /usr/libdata/lint が用いられます。 .It Ev TMPDIR 一時ファイル用のパスは通常、この環境変数をセットすることで変更できます。 .El .Sh 関連ファイル .Bl -tag -width /usr/libdata/lint/llib-lc.ln -compact .It Pa /usr/libexec/lint Ns Bq 12 プログラム .It Pa /usr/libdata/lint/llib-l*.ln 前もって作成されている様々な lint ライブラリ .It Pa /tmp/lint* 一時ファイル .El .Sh 関連項目 .Xr cc 1 , .Xr cpp 1 , .Xr make 1 .Sh 作者 .An Jochen Pohl .Sh バグ .Xr exit 3 や .Xr longjmp 3 および戻って来ない他の関数は正しく理解されません。 これらは様々な不正診断の原因となります。 .Pp 最初の extern 宣言の前でのみ用いられる static 関数は、 未使用であると報告されます。 .Pp .Fl o オプションによって作られたライブラリは、のちの .Nm 実行で用いた場合、 ライブラリ作成時に報告されたある種のエラーが再度報告され、 ライブラリ作成時に用いたオリジナルのソースファイルの行番号およびファイル名が エラーメッセージ中に表示されることがあります。 そのため、lint ライブラリ作成には .Fl C オプションを用いることを推奨します。