C ユーザーズガイド

lint の指令

事前定義された値

次の事前定義はすべてのモードで有効です。

_ _sun

_ _unix

_ _lint

_ _SUNPRO_C=0x500

_ _'uname -s'_'uname -r' (例: _ _SunOS_5_7)

_ _RESTRICST (-Xa および -Xt モードのみ)

_ _sparc (SPARC)

_ _i386 (x86)

_ _BUILTIN_VA_ARG_INCR

_ _SVR4

_ _sparcv9 (-Xarch=v9)

次の事前定義は -Xc モード以外で有効です。

sun

unix

sparc (SPARC)

i386 (x86)

lint

指令

lint 指令を /*...*/ の形式で注釈として表記する方法は、現在サポートされていますが、将来はサポートされなくなる予定です。指令を注釈として挿入する際は、ソースコードの注釈 NOTE(...) として表記することをお勧めします。

以下のようにファイル note.h をインクルードして、lint 指令をソースコードの注釈として指定してください。

#include <note.h>

lint は、ソースコードの注釈を別のツールと共有します。Sun ANSI C コンパイラをインストールすると、/usr/lib/note/SUNW_SPRO-lint ファイルが自動的にインストールされます。このファイルには、locklint が認識する注釈の名前がすべて記述されています。ただし、Sun C のソースコードを検査する lint は、/usr/lib/note/OPT/SUNWspro/<現リリース>/note の全ファイルを検索して、該当する注釈を探します。

次のように、環境変数 NOTEPATH を設定することにより、/usr/lib/note 以外の位置を指定することもできます。


% setenv NOTEPATH ${NOTEPATH}: <ディレクトリ>

表 5-6 に、lint 指令と動作を示します。

表 5-6 lint 指令と動作

指令 

動作 

NOTE(ALIGNMENT(<関数>,n))

n=1, 2, 4, 8, 16, 32, 64, 128

lint に、関数結果を n バイト境界で整列させます。たとえば、malloc() は、char* または void* を返すように定義されていますが、実際にはワードで、また場合によってはダブルワードで整列したポインタを返します。 不正な境界整列に関するメッセージが抑制されます。

NOTE(ARGSUSED(n)) /*ARGSUSEDn*/

指令の次に来る関数に対して、-v オプションのような動作を行います。 以下のメッセージが抑制されます。

引数が関数中で使用されていません

指令の後に来る関数定義の最初の n 個以降のすべての引数を対象します。デフォルトは 0 で、必ず n の指定が必要です。

NOTE(ARGUNUSED(<引数>[, <引数>...]))

lint が、指定した引数の使用状況を検査しないようにします (このオプションは、指令の次に来る関数に対してのみ有効です)。 以下のメッセージが抑制されます。

引数が関数中で使用されていません

NOTE または指令で指定された引数すべてを対象とします。

NOTE(CONSTCOND) /*CONSTCOND*/

条件式中の定数オペランドに関する警告を抑制します。 以下のメッセージが抑制されます。 

条件のコンテキストに定数があります

演算子 "!" のオペランドが定数です

論理式が常に偽です: 演算子 "&&"

論理式が常に真です: 演算子 "||"

指令の後に来る言語構造が対象となります。NOTE(CONSTANTCONDITION) または /* CONSTANTCONDITION */ も使用できます。

NOTE(EMPTY) /*EMPTY*/

if 文に続く空文の内容に関する警告を抑制します。この指令は、条件式とセミコロンの間で指定します。この指令は、有効な else 文を持つ空の if 文をサポートするためにあります。また、空の else 文に対するメッセージも抑制します。 以下のメッセージが抑制されます。

文が帰結していません: else

(else 文とセミコロンの間に挿入された場合)

文が帰結していません: if (if の条件式とセミコロンの間に挿入された場合)

NOTE(FALLTHRU) /*FALLTHRU*/

case 文または default ラベルの文までの通り抜けに関する警告を抑制します。 この指令は、ラベルの直前で指定します。

以下のメッセージが抑制されます。 

case 文を通り抜けます

指令の後に来る case 文が対象となります。NOTE(FALLTHROUGH) または /* FALLTHROUGH */. も使用できます。

NOTE(LINTED (<メッセージ>))/*LINTED [<メッセージ>]*/

使用されない変数または関数に関する警告を除く、ファイル内の警告をすべて抑制します。この指令は、lint の警告が表示された行の直前で指定します。-k オプションは、lint がこの指令を扱う方法を変更します。lint は、メッセージを抑制する代わりに、コメントに含まれているメッセージがある場合は、そのメッセージを表示します。 この指令は、lint 実行後にフィルタを行うための -s オプションと組み合わせて使用すると便利です。

-k が指定されない場合、指令の後に来るコード行の下記以外のファイル内問題に属するすべての警告を抑制します。

引数が関数中で使用されていません

宣言がブロック中で使用されていません

変数が関数中で設定されていますが使用されていません

静的シンボルが使用されていません

変数が関数中で使用されていません

<メッセージ> は無視されます。

NOTE(LINTLIBRARY) /*LINTLIBRARY*/

-o が指定された場合、この指令が先頭に付く .c ファイル中の定義だけをライブラリ .ln ファイルに書き込みます。ファイル内で使用されない関数および関数の引数に関する内容を抑制します。

NOTE(NOTREACHED) /*NOTREACHED*/

到達不可コードに関するコメントを適切な時点で停止します。このコメントは、通常、exit(2) などの、関数に対するコールの直後に位置します。 以下のメッセージが抑制されます。

到達できない文です

指令の後に来る到達されない文が対象の場合。

case 文を通り抜けます指令の後の case 文で、指令の前の case 文から到達されないものが対象の場合。

関数が値を返さずに終了しています関数の最後で指令の後に来る中閉じ括弧が対象の場合。

NOTE(PRINTFLIKE(n))

NOTE(PRINTFLIKE(<関数>,n))/*PRINTFLIKEn*/

指令の後に来る関数定義の第 n 番目の引数を [fs]printf() の書式文字列として扱い、下記のメッセージを有効にします。

書式文字列が正しくありません

書式から参照される引数が足りません

書式から参照されていない引数があります

残りの引数と変換指示子の間の不整合も対象にします。lint はデフォルトで、標準 C ライブラリで提供される [fs]printf() 関数を呼び出すときのエラーに対してこれらの警告を出します。NOTE 形式の場合は、必ず n を指定します。

NOTE(PROTOLIB(n)) /*PROTOLIBn*/

n が 1 で NOTE(LINTLIBRARY) または /* LINTLIBRARY */ が使用される場合、この指令が先頭に付く .c ファイルの関数プロトタイプ宣言だけをライブラリ .ln ファイルに書き込みます。デフォルトは処理を取り消す 0 です。NOTE 形式の場合は、必ず n を指定します。

NOTE(SCANFLIKE(n))NOTE(SCANLIKE(<関数>,n))/*SCANFLIKEn*/

関数定義の第 n 番目の引数が [fs]scanf() の書式文字列として扱われること以外は NOTE(PRINTFLIKE(n)) または /* PRINTFLIKEn */ と同じです。デフォルトでは、lint は標準 C ライブラリで提供される [fs]scanf() 関数を呼び出すときのエラーに対し警告を出します。NOTE 形式の場合は、必ず n を指定します。

NOTE(VARARGS(n)) NOTE(VARARGS(<関数>,n)) /*VARARGSn*/

指令の後に来る関数宣言の中の可変数の引数を検査する通常の処理を抑制します。最初の n 個の引数のデータ型を検査します。n が指定されていない場合は、n=0 とみなします。新規のコードを書く場合やコードを更新する場合、末尾には省略記号 (...) を使用することをお勧めします。

この指令の直後で定義されている関数に関しては、以下のメッセージが抑制されます。 

可変数の引数で関数が呼び出されています

n 以上の引数を持つ関数に対する呼び出しを対象にします。

NOTE 形式の場合は、必ず n を指定します。