C ユーザーズガイド

lint のオプション

lint プログラムは静的アナライザです。そのため、検出した依存性に関する実行時の結果を評価できません。たとえば、あまり重要ではない何百もの到達不可能な break 文を持ち、これについてユーザーがほとんど何もすることができないプログラムがあるとすると、lint はそれに忠実にフラグを立ててしまいます。この場合、lint のコマンド行オプションと指令 (ソーステキストに埋め込まれた特別の注釈) が役に立ちます。以下にその例を示します。

lint のオプションを以下にアルファベット順に説明します。いくつかの lint オプションは、lint 診断メッセージの抑制に関連しています。アルファベット順の説明の後、表 5-5 にこれらのオプションとそれが抑制するメッセージの一覧を示します。拡張 lint を呼び出すオプションは -N で始まります。

lint は、-A、-D、-E、-g、-H、-O、-P、-U、-Xa、-Xc、-Xs、-Xt、-Y を含む多くの cc コマンド行オプションを認識しますが、-g と -O は無視します。認識されないオプションがあると警告が出され、そのオプションは無視されます。

-#

冗長モードをオンにし、呼び出すごとに各構成要素を表示します。

-###

呼び出すごとに各構成要素を表示しますが、実際には実行しません。

-a

一定のメッセージを抑制します。表 5-5 を参照してください。

-b

一定のメッセージを抑制します。表 5-5 を参照してください。

-C<ファイル名>

指定されたファイル名を持った .ln ファイルを作成します。これらの .ln ファイルは、lint の最初のパスだけで作成されます。<ファイル名> はフルパス名でもかまいません。

-c

コマンド行で指定された .c ファイルごとに、lint の第 2 のパスに関連する情報からなる .ln ファイルを作成します。第 2 パスは実行されません。

-dirout=<ディレクトリ>

lint 出力ファイル (.ln ファイル) を入れる <ディレクトリ> を指定します。このオプションは -c オプションに影響を与えます。

-err=warn

すべての警告をエラーとして扱います。つまり、警告が発生した時点で、エラー発生時と同様に lint は終了し、障害ステータスが残ります。

-errchk=l(, l)

値渡しされた構造体引数 structarg を検査します。ロング整数、およびポインタのサイズが 64 ビットの環境への移植性を検査します。

l には、次に示す 1 つまたは複数の項目をコンマで区切って指定します。

%all

errchk による検査をすべて実行します。

%none

errchk による検査を行いません。これはデフォルトです。

longptr64

ロング整数、およびポインタのサイズが 64 ビットと標準整数のサイズが 32 ビットの環境への移植性を検査します。明示的なキャストが使用されている場合でも、ポインタ式とロング整数式の標準整数への代入を検査します。

no%longptr64

errchk による longptr64 の検査を行いません。

値は、コンマを用いて組み合わせることができます。 -errchk=longptr64,structarg

デフォルトは、-errchk=%none です。-errchk だけを指定すると、 -errchk=%all を指定するのと同じことになります。

no%structarg

errchk による structarg の検査を行いません。

33

parentheses

コードの保守性を高めます。-errchk=parentheses で警告が返された場合は、さらに括弧を使用して、コード内の演算の優先順位を明確に指示することを検討してください。

sizematch

小さな整数に大きな整数が代入された場合に警告を発行します。この警告は、サイズが同じであっても、符号が異なる整数間の代入 (unsigned int = signed int) についても発行されます。

structarg

値渡しされた構造体引数 structarg を検査します。仮引数の型が不明の場合は、その旨が報告されます。

-errfmt=f

lint 出力の書式を指定します。f には、macro、simple、src、tab のいずれか 1 つを指定できます。

表 5-1 -errfmt の値

値 

意味 

macro

マクロを展開して、エラーのあるソースコード、行番号、場所を表示します。 

simple

エラーのある行番号と場所番号 (大括弧内) を表示し、1 行の (簡単な) 診断メッセージを示します。-s オプションと同様ですが、エラー位置に関する情報が入っています。 

src

エラーのあるソースコード、行番号、場所を表示します。マクロは展開しません。 

tab

表形式で表示します。これがデフォルトです。 

デフォルトは -errfmt=tab です。-errfmt だけを指定すると、-errfmt=tab を指定するのと同じことになります。

複数の書式を指定すると最後に指定した書式が使用され、lint は使用されない書式について警告を出します。

-errhdr=h

-Ncheck で検査対象になるヘッダーファイルを限定します。h には、<ディレクトリ>、no%<ディレクトリ>、%all、%none、%user の 1 つまたは複数をコンマで区切って指定します。

表 5-2 -errhdr の値

値 

意味 

<ディレクトリ> 

<ディレクトリ> で使用されているヘッダーファイルを検査します。 

no%<ディレクトリ> 

<ディレクトリ> で使用されているヘッダーファイルを検査しません。 

%all

使用されているすべてのヘッダーファイルを検査します。 

%none

ヘッダーファイルを検査しません。これがデフォルトです。 

%user

使用されているすべてのユーザー定義のヘッダーファイルを検査します。すなわち、/usr/include およびそのサブディレクトリに入っているヘッダーファイルとコンパイラが提供しているヘッダーファイルを除く、すべてのヘッダーファイルを検査します。 

デフォルトは -errhdr=%none です。-errhdr だけを指定すると、-errhdr=%user を指定するのと同じことになります。以下に例を示します。


% lint -errhdr=inc1 -errhdr=../inc2

この例は、ディレクトリ inc1../inc2 内で使用されているヘッダーファイルを検査します。


% lint -errhdr=%all,no%../inc

この例は、ディレクトリ ../inc に入っているものを除く、使用されているすべてのヘッダーファイルを検査します。

-erroff=<タグ>(,<タグ>)

lint エラーメッセージを抑制または使用可能にします。

t には、<タグ>、no%<タグ>、all、%none の 1 つまたは複数をコンマで区切って指定します。

表 5-3 -erroff の値

値 

意味 

<タグ> 

<タグ> で指定したメッセージを抑制します。-errtags=yes オプションで、メッセージのタグを表示することができます。 

no%<タグ> 

<タグ> で指定したメッセージを使用可能にします。 

%all

すべてのメッセージを抑制します。 

%none

すべてのメッセージを使用可能にします。これがデフォルトです。 

デフォルトは -erroff=%none です。-erroff だけを指定すると、-erroff=%all を指定するのと同じことになります。


% lint -erroff=%all,no%E_ENUM_NEVER_DEF,no%E_STATIC_UNUSED

この例は、「列挙型が定義されていません」と「静的シンボルが使用されていません」のメッセージだけを表示し、その他のメッセージは抑制します。


% lint -erroff=E_ENUM_NEVER_DEF,E_STATIC_UNUSED

この例は、「列挙型が定義されていません」と「静的シンボルが使用されていません」のメッセージだけを抑制します。

-errtags=a

各エラーメッセージのメッセージタグを表示します。a には yes または no のいずれかを指定します。デフォルトは -errtags=no です。-errtags だけを指定すると、-errtags=yes を指定するのと同じことになります。

すべての -errfmt オプションに使用できます。

-F

コマンド行で指定された .c ファイルを参照するとき、そのベース名ではなくコマンド行に与えられたパス名を出力します。

-fd

古い形式の関数定義または宣言について報告します。

-flagsrc=<ファイル>

<ファイル> 中に格納されたオプションを用いて lint を実行します。<ファイル> には、1 行に 1 つずつ、複数のオプションを指定できます。

-h

一定のメッセージを抑制します。表 5-5 を参照してください。

-I<ディレクトリ>

インクルード用ヘッダーファイルを <ディレクトリ> から検索します。

-k

/*LINTED[<メッセージ>]*/ 指令または注釈 NOTE(LINTED(<メッセージ>)) の動作を変更します。通常 lint は、上述のような指令の後にコードが続く場合、警告メッセージを抑制します。-k オプションを指定した場合は、指令または注釈の中のコメントを含むメッセージを出力します。

-L<ディレクトリ>

-l と共に使用し、<ディレクトリ> の lint ライブラリを検索します。

-lx

lint ライブラリ llib-lx.ln にアクセスします。

-m

一定のメッセージを抑制します。表 5-5 を参照してください。

-Ncheck=c

ヘッダーファイル中の宣言の対応とマクロの検査を行います。c には、検査項目である macroextern%all%noneno%macrono%extern の 1 つまたは複数をコンマで区切って指定します。

表 5-4 -Ncheck の値

値 

意味 

macro

ファイル間でのマクロ定義の一貫性を検査します。 

extern

ソースファイルとそれに関連するヘッダーファイルとの間の宣言の 1 対 1 対応を検査します (たとえば <ファイル 1>.c と <ファイル 1>.h )。ヘッダーファイルの extern 宣言に余分も不足もないことを確認します。 

%all

-Ncheck のすべての検査を実行します。 

%none

-Ncheck の検査を実行しません。これがデフォルトです。 

no%macro

-Ncheck のマクロ検査を実行しません。 

no%extern

-Ncheck の extern 検査を実行しません。 

デフォルトは -Ncheck=%none です。-Ncheck だけを指定すると、-Ncheck=%all を指定するのと同じことになります。

値はコンマを用いて組み合わせることができます (例 : -Ncheck=extern,macro)。

次に例を示します。

% lint -Ncheck=%all,no%macro

この例はマクロ以外のすべての検査項目を実行します。

-Nlevel=n

問題報告の解析レベルを指定します。このオプションによって、検出するエラーの量を制御することができます。レベルが高いほど検証にかかる時間は長くなります。n は、1、2、3、4 のいずれかの数値です。デフォルトは -Nlevel=2 です。-Nlrevel-Nlevel=4 と同義になります。

-Nlevel=1

個々の手続きを解析します。いくつかのプログラムの実行パスで発生する無条件エラーを報告します。大域的なデータおよび制御のフロー解析は行いません。

-Nlevel=2

デフォルトです。大域的なデータおよびフローを含め、プログラム全体を解析します。いくつかのプログラムの実行パスで発生する無条件エラーを報告します。

-Nlevel=3

-Nlevel=2 で実行される解析に加えて、定数の伝播、定数が実際の引数として使用されている場合を含め、プログラム全体を解析します。

この解析レベルでの C プログラムの検査は、直前のレベルより 2 倍から 4 倍長い時間がかかります。これは、lint がプログラムの変数に対して取り得る値の集合を作成し、プログラムの部分解釈を行うためです。これらの変数値の集合は、定数と、プログラムで使用可能な定数オペランドを含む条件文に基づいて作成され、他の集合 (定数伝播の形式) を作成するときの基準になります。その後、解析の結果として受け取った集合は、次のアルゴリズムに従って誤りがないか評価されます。

オブジェクトが取り得る値の集合の中に正しい値が存在する場合は、その値が次の伝搬の基準として使用されます。正しい値が存在しない場合は、エラーと診断されます。

-Nlevel=4

-Nlevel=3 で実行される解析に加えて、プログラム全体を解析して一定のプログラム実行パスが使用された場合に発生する条件付きエラーも報告します。

この解析レベルでは、さらに多くの診断メッセージが出力されます。一般的に、この解析アルゴリズムは、不正な値に対してエラーメッセージが生成されることを除けば、-Nlevel=3 の解析アルゴリズムと同じです。このレベルでの解析に要する時間は、2 桁 (約 20 倍から 100 倍) ほど増加する可能性があります。余計にかかる時間は、再帰、条件文などの面でのプログラムの複雑さに比例して長くなります。このため、100,000 行を超えるプログラムに対してこのレベルの解析を行うことはあまり現実的ではありません。

-n

デフォルトの lint 標準 C ライブラリとの互換性検査を抑制します。

-ox

llib-lx.ln という名前の lint ライブラリを作成します。このライブラリは、lint が第 2 パスで使用する .ln ファイルから作成されます。-c オプションを使用すると、すべての -o オプションが無効になります。不要なメッセージを表示しないで lib-lx.ln を作成するには、-x オプションを使用します。lint ライブラリのソースファイルが外部からの参照専用である場合は、-v オプションが便利です。作成された lint ライブラリは、後で lint-lx で呼び出された場合に使用することができます。

デフォルトでは、ライブラリは lint の基本形式で作成されます。拡張 lint モードを使用した場合は、ライブラリは拡張モードで作成されるため、それ以外のモードでは使用できなくなります。

-p

移植性に関連する一定のメッセージを使用可能にします。

-R<ファイル>

cxref(1) で使用する .ln ファイルを <ファイル> に書き込みます。lint が拡張モードで起動されている場合、このオプションは拡張モードを使用不可能にします。

-s

複合メッセージを単一メッセージに変換します。

-u

一定のメッセージを抑制します。表 5-5 を参照してください。このオプションは、大型プログラムのファイルの一部分に対して lint を実行する場合に適しています。

-V

製品名とリリース時期を標準エラーに書き込みます。

-v

一定のメッセージを抑制します。表 5-5 を参照してください。

-W<ファイル>

cflow(1) で使用する .ln ファイルを <ファイル> に書き込みます。lint が拡張モードで起動されている場合、このオプションは拡張モードを取り消します。

-x

一定のメッセージを抑制します。表 5-5 を参照してください。

-XCC=a

C++ 形式のコメントを受け入れます。このオプションを使用すると、// を使用してコメントの始まりを示すことができます。a には yes または no のいずれかを指定します。 デフォルトは -XCC=no です。-XCC だけを指定すると、-XCC=yes を指定するのと同じことになります。

-Xarch=v9

__sparcv9 マクロを事前に定義して、v9 版の lint ライブラリを検索します。

-Xexplicitpar=a

(SPARC) lint#pragma MP 指令を認識するよう指定します。a には yes または no のいずれかを指定します。デフォルトは -Xexplicitpar=no です。-Xexplicitpar だけを指定すると、-Xexplicitpar=yes を指定するのと同じことになります。

-Xkeeptmp=a

lint の実行中、一時ファイルを自動的に削除せず、作成した状態のままにします。a には yes または no のいずれかを指定します。デフォルトは -Xkeeptmp=no です。 -Xkeeptmp だけを指定すると、-Xkeeptmp=yes を指定するのと同じことになります。

-Xtemp=<ディレクトリ>

一時ファイルのディレクトリを <ディレクトリ> に設定します。このオプションを指定しないと、一時ファイルは /tmp に格納されます。

-Xtime=a

lint パスの実行時間を報告します。a には yes または no のいずれかを指定します。デフォルトは -Xtime=no です。-Xtime だけを指定すると、-Xtime=yes を指定するのと同じことになります。

-Xtransition=a

K&R C と Sun ANSI C の相違を検出した場合に警告を出します。a には yes または no のいずれかを指定します。デフォルトは -Xtransition=no です。-Xtransition だけを指定すると、-Xtransition=yes を指定するのと同じことになります。

-y

コマンド行で指定されたすべての .c ファイルを、/* LINTLIBRARY */ 指令で開始した場合または注釈 NOTE(LINTLIBRARY) が付いている場合と同じように扱います。lint ライブラリは、通常、/* LINTLIBRARY */ 指令または注釈 NOTE(LINTLIBRARY) を使用して作成します