Oracle Solaris Studio 12.4 Man Pages

印刷ビューの終了

更新: January 2015
 
 

lint(1)

名前

lint - C プログラム検査機能

形式

 lint [-#] [-###] [-a] [-b] [-Cfilename] [-c] [-dirout=dir] [-err=warn] [-errchk=l] [-errfmt=f] [-errhdr=h] [-erroff=t] [-errsecurity=v] [-errtags=a] [-errwarn=t] [-F] [-fd] [-flagsrc=file] [-h] [-Idir] [-k] [-Ldir] [-lx] [-m] [-m32|-m64] [-Ncheck=c] [-Nlevel=n] [-n] [-ox] [-p] [-Rfile] [-s] [-u] [-V] [-v] [-Wfile] [-Xarch=amd64] [-Xarch=v9] [-Xalias_level[=l]] [-XCC=a] [-Xc99[=o]] [-Xkeeptmp=a] [-Xtemp=dir] [-Xtime=a] [-Xtransition=a] [-Xustr={ascii_utf16_ushort|no}] [-x] [-y] files 

説明

lint は、C プログラムファイルの中でバグがある、移植できない、または無駄が多い機能を検出します。

lint は、コンパイラよりも厳密に型の使用を検査します。lint はエラーおよび警告メッセージを発行します。たとえば次の項目を検出します。

  • 到達できない文

  • 先頭から入られないループ

  • 宣言されているが使用されていない自動変数

  • 値が一定である論理式。

lint は、ある場所では値を返し別の場所では値を返さない関数、呼び出されるときの引数の数や型が変動する関数、値が使用されていなかったり値が使用されていても何も返されない関数を検査します。

lint は次の 2 つのモードで動作します。基本モードは lint プログラムのデフォルトであり、拡張モードは基本モードの lint が行うすべての操作に加え、詳細なコードの解析も行います。

拡張モードで行われる解析は次のとおりです。

  • ソースプログラムの構造およびフロー解析

  • 定数の伝播と定数式の評価

  • 制御フローとデータフローの解析

  • データ型の使用状況の解析

したがって、lint は拡張モードで次の問題を検出できます。

  • 使用されていない#include指令、変数、手続き

  • 解放後のメモリー使用

  • 使用されていない割り当て

  • 初期化前の変数値の使用

  • 割り当てられていないメモリーの解放

  • 定数データセグメントへの書き込み時のポインタの使用

  • 等しくないマクロの再定義

  • 到達しないコード

  • 使われ方が一致しない共用体内の値のタイプ

  • 実際の引数の暗黙の型変換

拡張モードは、-Nlevel または -Ncheck オプションで有効になります (後述の説明を参照してください)。

引数の名前の末尾が .c の場合、C ソースファイルとみなされます。末尾が .i の場合は、プリプロセッサ出力ファイル (コンパイラに対し -P オプションで生成) とみなされます。

引数の名前の末尾が .ln の場合は、-C-c、または -o のいずれかのオプションを使用して以前に lint を呼び出した結果のファイルとみなされます。.ln ファイルは、.c ファイルを入力ファイルに指定して cc(1) コマンドを実行した結果生成される .o (オブジェクト) ファイルに似ています。その他の接尾辞のファイルの場合、警告が生成され、無視されます。

拡張モードでは、lint は基本モードで生成される .ln ファイルより多くの情報が格納された .ln ファイルを生成します。拡張モードの lint は、基本モードまたは拡張モードのどちらの lint で生成された .ln ファイルでもすべて読み取って理解できます。基本モードの lint は、基本モードの lint を用いて生成された .ln ファイルだけを読み取って理解できます。

lint は、.c.i.ln、および llib-lx.ln (-lx で指定) のファイルをすべて受け付け、コマンド行で指定された順序で処理します。デフォルトでは、lint は、標準の C lint ライブラリ (llib-lc.ln) をファイルのリストの末尾に付加します。-C または -c オプションを使用する場合、.ln および llib-lx.ln ファイルは無視されます。-C オプションも -c オプションも使用しない場合、lint の第 2 パスで .lnllib-lx.ln ファイルリストに相互互換性があるか検査されます。

lint のオプションはいくつでも、どの順序でも指定でき、ファイル名引数と組み合わせることができます。

ユーザー指定のデフォルトコンパイラオプション起動ファイル

これらのデフォルトコンパイラオプションファイルは、ユーザーがすべてのコンパイルに適用される (ほかの方法で上書きされる場合を除く)、一連のデフォルトオプションを指定することを許可します。たとえば、ファイルによって、すべてのコンパイルのデフォルトを -xO2 としたり、またはファイル setup.il を自動的に含めたりするように指定できます。

デフォルトのオプションファイルも lint とともに使用できます。

コンパイラは起動時に、すべてのコンパイルに含めるべきデフォルトオプションがリストされているデフォルトオプションファイルを検索します。環境変数 SPRO_DEFAULTS_PATH は、デフォルトファイルを検索するディレクトリのコロン区切りリストを指定します。

環境変数が設定されていない場合、標準のデフォルトセットが使用されます。環境変数が設定されているが空の場合、デフォルトは使用されません。

デフォルトファイルの名前は compiler.defaults の形式である必要があります。compilercc、c89、c99、CC、ftn、または lint のいずれかです。たとえば、lint のデフォルトは lint.defaults になります。

コンパイラ用のデフォルトファイルが SPRO_DEFAULTS_PATH に一覧表示されているディレクトリ内で見つかった場合、コンパイラはコマンド行のオプションを処理する前に、このファイルを読み込んでオプションを処理します。最初に見つかったデフォルトファイルが使用され、検索は終了します。

システム管理者は、システム全体のデフォルトファイルを Studio-install-path/prod/etc/config に作成できます。環境変数が設定されている場合、インストールされたデフォルトファイルは読み取られません。

デフォルトファイルの形式はコマンド行と同様です。ファイルの各行には、1 つ以上のコンパイラオプションを空白で区切って含めてもかまいません。ワイルドカードや置換などのシェル展開は、デフォルトファイル内のオプションには適用されません。

—#、—###、および —dryrun の各オプションによって生成される詳細出力では、SPRO_DEFAULTS_PATH の値と、完全展開されたコマンド行が表示されます。

ユーザーによってコマンド行で指定されたオプションは、通常、デフォルトファイルから読み取られたオプションをオーバーライドします。たとえば、—xO4 でのコンパイルがデフォルトファイルで指定されており、ユーザーがコマンド行で —xO2 を指定した場合、—xO2 が使用されます。

デフォルトオプションファイルに記載されているオプションの一部は、コマンド行で指定されたオプションのあとに付加されます。これらは、プリプロセッサオプション —I、リンカーオプション —B、—L、—R —l、および、ソースファイル、オブジェクトファイル、アーカイブ、共有オブジェクトなどのすべてのファイル引数です。

デフォルトオプションファイルのインタフェース安定性はコミットされていません。オプション処理の順序は、将来のリリースで変更される可能性があります。

オプション

lint のオプションは次のとおりです。

-#

コンポーネントが呼び出されるごとにそのコンポーネントを表示します (冗長モード)。

-###

コンポーネントが呼び出されるごとにそのコンポーネントを表示しますが、-# オプションとは異なり、実際には実行しません。

-a

long でない変数に long の値を割り当てたときの警告を抑制します。

-b

到達不可能な break 文および空の文に対し、到達されない文に関する警告を抑制します。

-Cfilename

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

-c

lint が、コマンド行の個々の .c ファイルに対して 1 つの .ln ファイルを生成できるようにします。これらの .ln ファイルは、lint の第 1 パスだけで生成され、関数間の互換性は検査されません。

-dirout=dir

すべての lint 出力ファイルが置かれるディレクトリ名を設定します。このオプションは -c オプションに影響を与えます。

-err=warn

これは -errwarn=%all のマクロです。

-errchk=l

値によって渡された構造体引数を検査します。長整数およびポインタのサイズが 64 ビットである環境への移植性を検査します。

値は、-errchk=longptr64,structarg のようにコンマ区切りのリストにすることができます。

デフォルトは、-errchk=%none です。-errchk と指定すると、-errchk=%all を指定した場合と同じ結果が得られます。

l には、次の 1 つ以上の検査項目をコンマで区切って指定します。

[no%]locfmtchk

第 1 パスで printf のような書式の文字列を lint で検査する場合にこのオプションを使用します。-errchk=locfmtchk を使用するかどうかに関係なく、第 2 パスでは必ず lint は printf のような書式の文字列を検査します。

[no%]parentheses

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

[no%]signext

このオプションは、符号なし整数型の式における符号付き整数値の符号拡張を、ANSI/ISO C の通常の値保持規則が認めるときに、エラーメッセージを生成します。このオプションは、-errchk=longptr64 が一緒に指定された場合にはエラーメッセージを出力するだけです。

[no%]sizematch

大きな整数が小さな整数に割り当てられるときに警告します。これらの警告は、同じサイズでも符号の有無が異なる整数間で割り当てるときにも発行されます (たとえば unsigned int = signed int)。

[no%]structarg

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

[no%]longptr64

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

システムヘッダーファイルによって、ポインタの操作を目的とした型が定義されることに注意してください。-m32 フラグを使用すると、これらの型は、ポインタを安全に操作できない int などの基底の型として定義され、誤った警告が発行される場合があります。たとえば、size_t の使用法は次のようになります。

#include <stdlib.h>
size_t
myfiunk(uint32_t param)
{
        return sizeof(uint64_t) * param;
}
.
$ lint -m32 -mux -errchk=longptr64 bug.c
(5) warning: assignment of 64-bit integer to 32-bit integer
$
%all

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

%none

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

-errfmt=f

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

macro

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

simple

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

src

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

tab

表形式で表示します。

デフォルトは -errfmt = tab です。-errfmt を指定すると、-errfmt = tab を指定した場合と同等の結果が得られます。

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

-errhdr=h

-Ncheck と使用した場合、ヘッダーファイル用の特定のメッセージを報告できるようにします。h には、dirno%dir%all、%none、%user のいずれか 1 つ以上をコンマで区切って指定します。

[no%]dir

ディレクトリ dir からインクルードされたヘッダーファイル用の -Ncheck のメッセージを報告します [しません]。

%all

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

%none

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

%user

デフォルト。すべてのユーザーヘッダーファイルを検査します。/usr/include およびそのサブディレクトリ内のシステムインクルードファイルを検査しません。コンパイラによって提供されたシステムヘッダーファイルを検査しません。

-erroff=t

lint エラーメッセージを抑制するか有効にします。t には、tagno%tag%all、%none の 1 つ以上をコンマで区切って指定します。

[no%]tag

tag で指定したメッセージを抑制します。

%all

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

%none

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

デフォルトは -erroff=%none です。-erroff と指定すると、-erroff=%all を指定した場合と同等の結果が得られます。

-errsecurity=v

-errsecurity オプションを使用して、セキュリティーに問題がないかコードを検査します。v には、corestandardextended、または %none のいずれかを指定します。

-errsecurity の値が指定されていない場合は、lint によって -errsecurity=%none に設定されます。フラグを付けずに -errsecurity を指定した場合、lint によって -errsecurity=standard に設定されます。

core

このレベルでは、たいていの場合で安全でない、または検査することの難しいソースコードの構文がないかどうかを検査します。このレベルで行われる検査には次のものがあります。

  • printf() および scanf() 系の関数での変数書式文字列の使用

  • scanf() 関数での非結合文字列 (%s) 書式の使用

  • 安全な使用法のない関数 (gets()cftime()ascftime()creat()) の使用

  • O_CREAT() と組み合わせた open の不正使用

このレベルで警告が生成されるソースコードはバグと考えてください。問題のコードを変更することを推奨します。どんな場合でも、単純明快でより安全な別の方法があります。

standard

このレベルには、core レベルのすべての検査に加えて、安全かもしれないが、より良い別の方法がある構文のすべての検査が含まれます。このレベルは、新しく記述されたコードに最適です。このレベルで追加される検査には、次のものがあります。

  • strlcpy() 以外の文字列コピー関数の使用

  • 脆弱な乱数関数の使用

  • 安全でない関数を使った一時ファイルの生成

  • fopen() を使用したファイルの作成

  • シェルを呼び出す関数の使用

このレベルで警告を生成するソースコードは、新しいコードまたは大幅に修正したコードに書き換えてください。従来のコードに含まれるこうした警告に対処することと、アプリケーションを不安定にするリスクとのバランスを検討してください。

extended

このレベルには、core および standard レベルのすべての検査など、もっとも完全な検査セットが含まれます。また、状況によっては安全でない可能性がある構文について、多数の警告が生成されます。このレベルの検査は、コードを見直す際の一助になりますが、許容しうるソースコードが守る必要のある基準と考える必要はありません。このレベルで追加される検査には、次のものがあります。

  • ループ内部の getc() または fgetc() の呼び出し

  • パス名競合になりがちな関数の使用

  • exec 系の関数の使用

  • stat() とほかの関数との間の競合

安全上の潜在的な問題があるかどうかを判定するために、警告を生成するコードをこのレベルで見直してください。

-errtags=a

各エラーメッセージのメッセージタグを表示します。a には、yes または no のどちらかを指定できます。デフォルトは -errtags=no です。-errtags だけを指定すると、-errtags=yes を指定した場合と同等の結果が得られます。

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

-errwarn=t

指定された警告メッセージが発行されると、lint は障害ステータスで終了します。t には、次の 1 つ以上をコンマで区切って指定します。

tag

tag に指定されたメッセージが警告メッセージとして発行された場合、lint は致命的なエラーステータスで終了します。tag で指定されたメッセージが発行されない場合は無効です。

no%tag

タグに指定されたメッセージが警告メッセージとしてだけ発行された場合に、lint が致命的なエラーステータスで終了することがないようにします。tag で指定されたメッセージが発行されない場合は無効です。このオプションは、tag または %all を使用して以前に指定されたメッセージが警告メッセージとして発行されても lint が致命的なエラーステータスで終了しないようにする場合に使用してください。

%all

どのような警告メッセージが発行されても、lint が致命的なエラーステータスで終了するようにします。%all に続いて no%tag を使用して、特定の警告メッセージを対象から除外することもできます。

%none

どの警告タグが発行されても、警告メッセージによって lint が致命的なエラーステータスで終了することがないようにします。これはデフォルト値です。

-F

ファイルのパス名を出力します。lint は通常、パス名を伴わずにファイル名を出力します。

-fd

旧式の関数定義および宣言について報告します。

-flagsrc=file

ファイル file に含まれるオプションを指定して lint を実行します。ファイルには、1 行に 1 つずつ、複数のオプションを指定できます。

-h

バグの把握、スタイルの改善、無駄の削減を試みるヒューリスティックテストを適用しません。

-Idir

現在のディレクトリまたは標準の場所を検索する前に、インクルードされたヘッダーファイルをディレクトリ dir で検索します。

-k

/*LINTED [message]*/ 指令または NOTE(LINTED(message)) 注釈の動作を変更します。通常 lint は、前述のような指令のあとにコードが続く場合、警告メッセージを抑制します。lint は、メッセージを抑制する代わりに、指令または注釈の中のコメントを含むメッセージを出力します。

-Ldir

標準の場所を検索する前に、lint ライブラリを dir 内で検索します。

-lx

lint ライブラリ llib-lx.ln を取り込みます。たとえば、コマンド行に -lm を挿入すれば、lint バージョンの数学ライブラリ llib-lm.ln を取り込むことができます。この引数で、llib-lc.ln のデフォルトの使用法が抑制されることはありません。これらの lint ライブラリは想定されたディレクトリに存在する必要があります。このオプションを使用してローカルの lint ライブラリを参照できるので、マルチファイルプロジェクトの開発で役立ちます。

-m

静的と宣言できる外部シンボルに関する警告を抑制します。

-m32
-m64

分析するプログラムのメモリーモデルを指定します。また、選択したメモリーモデル (32 ビット/64 ビット) に対応する lint ライブラリを検索します。

32 ビット C プログラムの検証には -m32 を、64 ビット C プログラムの検証には -m64 を使用してください。

ILP32 メモリーモデル (32 ビット int、long、ポインタデータ型) は、64 ビット対応ではないすべての Oracle Solaris プラットフォームおよび Linux プラットフォームでのデフォルトです。LP64 メモリーモデル (64 ビット long、ポインタデータ型) は 64 ビット対応の Linux プラットフォームのデフォルトです。-m64 は LP64 モデル対応のプラットフォームでのみ使用できます。

以前のリリースのコンパイラでは、メモリーモデル、ILP32 または LP64 は、-Xarch フラグを選択して指定されていました。Sun Studio 12 以降のコンパイラでは、このようなことはありません。ほとんどのプラットフォームでは、コマンド行に -m64 を追加するだけで 64 ビットプログラムで lint を実行できます。

定義済みのマクロの詳細は、この lint オプションのリスト以降のセクションを参照してください。-Xarch も参照してください。

-Ncheck=c

対応する宣言についてヘッダーファイルを検査します。マクロを検査します。c には、次の 1 つ以上の検査項目をコンマで区切って指定します。

macro

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

extern

ソースファイルとそれに関連するヘッダーファイルとの間の宣言の 1 対 1 対応を検査します (たとえば file1.cfile1.h)。ヘッダーファイル内で余分なまたは見つからない extern 宣言がないことを確認します。

%all

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

%none

Ncheck のどの検査も実行しません。これはデフォルト値です。

no%macro

Ncheck のどのマクロ検査も実行しません。

no%extern

Ncheck のどの extern 検査も実行しません。

-Ncheck=extern,macro のように、値をコンマで結合してもかまいません。

デフォルトは -Ncheck=%none で、-Ncheck と指定すると -Ncheck=%all と指定した場合と同等の結果が得られます。

-Nlevel=n

(廃止) -Nlevel オプションは、将来のリリースで削除される予定です。

問題の報告に関して lint の拡張解析レベルを指定することによって、lint の拡張モードをオンにします。このオプションを指定して検出されるエラーの量を制御できます。レベルが高いほど検証にかかる時間は長くなります。n は数値で、1234 のいずれかです。デフォルトはありません。-Nlevel が指定されなかった場合は、lint の基本解析モードが使用されます。引数なしで -Nlevel が指定された場合は、-Nlevel=4 に設定されます。

lint の基本および拡張解析モードの詳細は、このマニュアルページの冒頭部分か『C ユーザーズガイド』を参照してください。

-Nlevel=1 単一のプロシージャーを解析します。いくつかのプログラムの実行パスで発生する無条件エラーを報告します。グローバルなデータおよび制御のフロー解析は行いません。

-Nlevel=2 デフォルトです。グローバルデータや制御フローを含め、プログラム全体を解析します。いくつかのプログラムの実行パスで発生する無条件エラーを報告します。

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

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

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

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

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

-n

標準 C lint ライブラリに対して互換性を検査しません。

-ox

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

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

-p

C のほかのダイアレクトに移植できるかどうかの検査を試みます。このオプションは、より厳密な検査を行うだけでなく、すべての非外部名を 8 文字に切り詰めます。また、すべての外部名を 6 文字に切り詰め、大文字か小文字のどちらかに統一します。

-Rfile

cxref1 で使用できるように、(.ln) ファイルを file に書き込みます。拡張モードがオンに切り替えられている場合、このオプションは拡張モードを無効にします。

-s

「警告:」または「エラー:」が先頭に置かれた単純な診断を生成します。デフォルトでは、lint は複合的な出力を生成するためにいくつかのメッセージをバッファリングします。

-u

使用されているが定義されていない関数および外部変数、または定義されているが使用されていない関数および外部変数に関する警告を抑制します。このオプションは、大型プログラムのファイルの一部分に対して lint を実行する場合に適しています。

-V

製品名およびリリースを標準エラー出力に書き込みます。

-v

関数で使用されていない引数に関する警告を抑制します。

-Wfile

cflow1 で使用できるように、(.ln) ファイルを file に書き込みます。拡張モードがオンに切り替えられている場合、このオプションは拡張モードを無効にします。

-Xalias_level[=l]

l は、anybasicweaklayoutstrictstdstrong のいずれかになります。詳細は、『C ユーザーズガイド』を参照してください。

-Xalias_level を指定しない場合、フラグのデフォルトは -Xalias_level=any です。これは、型に基づく別名解析が行われないことを意味します。-Xalias_level を指定してもレベルを設定しない場合、デフォルトは -Xalias_level=layout になります。

lint を実行するときの明確化のレベルは、コンパイラを実行するときのレベルよりも緩やかにしてください。明確化のレベルをコンパイルするときのレベルより厳しくしてlintを実行すると、結果は解釈するのが困難になり、誤解を招く恐れがあります。

-Xarch=amd64

非推奨。使用しないでください。-m32 | -m64 を参照してください。

-Xarch=v9

非推奨。使用しないでください。-m32 | -m64 を参照してください。

-XCC=a

C++ 形式のコメントを受け入れます。a は yes か no のどちらかになります。特に、/ は、コメントの先頭を示すために使用できます。デフォルトは -XCC=no であり、-XCC を指定すると、-XCC=yes を指定した場合と同等の結果が得られます。

注: -xc99=%none を使用する場合のみ、このオプションを使用する必要があります。デフォルトの -xc99=%all では、lint は // で指定したコメントを受け入れます。

-Xc99=o

-Xc99 フラグは、C99 規格 (ISO/IEC 9899:1999, Programming Language - C) から実装された機能に対するコンパイラの認識を制御します。

o には、allnone のいずれかを指定します。

-Xc99=none は、C99 機能の認識をオフにします。-Xc99=all は、サポートされている C99 機能の認識をオンにします。引数を付けずに -Xc99 を指定すると、-Xc99=all と同等の結果になります。

注: コンパイラのサポートレベルは、デフォルトで C99 規格の言語機能に設定されていますが、Solaris 8 および Solaris 9 ソフトウェアで用意されている /usr/include の標準ヘッダーは、1999 ISO/IEC C 規格に準拠していません。エラーメッセージが生成される場合は、-Xc99=none を指定して、前述のヘッダー用に 1990 ISO/IEC C 規格を使用してみてください。

-Xkeeptmp=a

lint 実行中に作成した一時ファイルを自動的に削除する代わりに保持します。a には yes か no を指定できます。デフォルトは -Xkeeptmp=no であり、-Xkeeptmp を指定すると、-Xkeeptmp=yes と指定した場合と同等の結果が得られます。

-Xtemp=dir

一時ファイル用のディレクトリを、dir に設定します。このオプションを指定しないと、一時ファイルは /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 と指定した場合と同等の結果が得られます。

-Xustr={ascii_utf16_ushort|no}

このオプションは、U"ASCII_string" 形式の文字列リテラルを unsigned short int 型の配列として認識できるようにします。このような文字列はまだ標準の一部ではないので、このオプションは標準でない C の認識を有効にします。

-Xustr=no を指定すると、lint は、U"ASCII_string" 文字列リテラルを認識しなくなります。このオプションのコマンド行の右端にあるインスタンスは、それまでのインスタンスをすべてオーバーライドします。

デフォルトは -Xustr=no です。引数を指定しないで -Xustr を指定した場合、コンパイラはこの指定を受け付けず、警告を出力します。C または C++ 規格で構文の意味が定義されると、デフォルト値が変わることがあります。

-Xustr=ascii_ustf16_ushort は、U"ASCII_string" 文字列リテラルを一緒に指定しなくても指定できます。このようにしてもエラーにはなりません。

U を先頭に付加した文字列を示すコード例については、cc1() のマニュアルページで -xustr の説明を参照してください。

-x

外部宣言によって参照されているが使用されていない変数を報告しません。

-y

/*LINTLIBRARY*/ 指令または NOTE(LINTLIBRARY) 注釈が使用されていた場合と同様に、lint が実行されているファイルを扱うように指定します。通常、lint ライブラリは、/*LINTLIBRARY*/ 指令または NOTE(LINTLIBRARY) 注釈を使用して作成されます。

lint は、-A-D-E-g-H-O-P-U-ansi-std=value-pedantic-Xa-Xc-Xs-Xt-Y などの多くの cc (1) コマンド行オプションを認識しますが、-g および -O は無視されます。認識されないオプションがあると警告が出され、そのオプションは無視されます。定義済みのマクロ lint は、特定の問題のあるコードを lint 用に変更または削除できるように定義されています。したがって、シンボル lint は、lint で検査する予定のすべてのコードの予約語と考えてください。

lint には、デフォルトで次の定義済みの述語が用意されています (-Xc モードでは有効ではありません)。

#assert lint (on)

lint トークンは、cc(1) のマニュアルページに記載のトークンとともにあらかじめ定義されています。

C ソースに特定の従来型のコメントがあると、lint の動作が変更されます。

/*ARGSUSEDn*/

lint が最初の n 個の引数の使用状況だけを検査するように指示します。n がない場合、0 とみなされます (このディレクティブは、その後ろの関数の -v オプションのように機能します)。

/*CONSTCOND*/ または /*CONSTANTCONDITION*/

条件式中の定数オペランドに関する警告を抑制します。

/*EMPTY*/

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

/*FALLTHRU*/ または /*FALLTHROUGH*/

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

/*LINTED [message]\(**/

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

/*LINTLIBRARY*/

-o が呼び出されると、それが先頭にある .c ファイル内の定義だけをライブラリ .lnファイルに書き込みます。この指令は、このファイル内で使用されていない関数および関数引数に関する警告を抑制します。

/*NOTREACHED*/

適切な地点で、到達不可能コードに関するコメントを停止します。[このコメントは、exit(2) のような関数の呼び出し直後に置かれます]。

/*PRINTFLIKEn*/

lint に、通常どおり最初の (n-1) 個の引数を検査させます。nth 番目の引数は、残りの引数の検査に使用される printf 書式文字列と解釈されます。

/*PROTOLIBn*/

n がゼロ以外の場合、lint が関数宣言プロトタイプを関数定義として扱うようにします。この指令は、/* LINTLIBRARY */ 指令と組み合わせた場合にのみ使用できます。n がゼロの場合、関数プロトタイプは通常どおりに扱われます。

/*SCANFLIKEn*/

lint に、通常どおり最初の (n-1) 個の引数を検査させます。nth 番目の引数は、残りの引数の検査に使用される scanf 書式文字列と解釈されます。

/*VARARGSn*/

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

ファイル note.h をインクルードすることによって、ソースコードの注釈という形式で lint の指令を指定することもできます。たとえば次のようになります。

#include <note.h>
 
NOTE(ARGSUSED(n))
NOTE(CONSTANTCONDITION)
NOTE(EMPTY)
NOTE(FALLTHROUGH)
NOTE(LINTLIBRARY)
NOTE(LINTED(message))
NOTE(NOTREACHED)
NOTE(PRINTFLIKE(n))
NOTE(PRINTFLIKE(func_name,n))
NOTE(PROTOLIB(n))
NOTE(SCANFLIKE(n))
NOTE(SCANFLIKE(func_name,n))
NOTE(VARARGS(n))
NOTE(VARARGS(func_name,n))
     
      

次の 2 つの指令は、注釈としてのみ使用できます。

NOTE(ALIGNMENT(func_name, n))

n=1248163264128

lint に関数結果を n バイトで整列させます。たとえば、malloc() は、「char*」または「void*」を返すように定義されていますが、実際にはワード、または場合によってはダブルワードで整列されたポインタを返します。

NOTE(ARGUNUSED(par_name[,par_name]))

lint が、指定した引数の使用状況を検査しないようにします (このオプションは、指令の後ろに来る関数に対してのみ有効です)。

lint に特定のオプションを付けると、エラーが発生した行へのポインタを付けて、ソースファイルの正確な行が示されます。この機能を有効にするオプションは -errfmt=[macro|simple|src|tab] です。このオプションを指定した場合、lint は次の情報を示します。

  • ソース行と位置

  • マクロの展開

  • エラーが発生しやすいスタック

lint は、ソースファイルごとに最初の出力を生成します。-s が指定されていない場合、すべてのソースファイルが処理されたあとで、インクルードされたファイルに関する警告が収集され、出力されます。最終的に、-C または -c オプションを使用しないと、すべての入力ファイルから収集された情報が集められ、その整合性が検査されます。この時点で、警告の原因が所定のソースファイルなのか、インクルードされたいずれかのファイルなのかはっきりしない場合は、ソースファイル名に続いて疑問符が出力されます。

-C-c、および -o オプションによる動作では、一連の C ソースファイルに対して lint を増分で使用できます。通常、ソースファイルごとに一度、-C または -c を指定して lint を呼び出します。これらの呼び出しごとに、.c ファイルに対応する .ln ファイルが生成され、そのソースファイルだけに関するメッセージがすべて出力されます。すべてのソースファイルに対して個別に lint が実行されたあと、必要な -lx オプションとともにすべての .ln ファイルをリストして、lint がもう一度呼び出されます (-C または -c オプションなし)。これにより、ファイル間の相違がすべて出力されます。このスキームは、make とともに使用すると効果があります。make を使用すれば、前回 lint を実行してから変更のあった一連のソースファイルについてのみ lint を実行できます。

環境変数

LINT_OPTIONS

lint のオプションのデフォルトセット。LINT_OPTIONS は、コマンド行の lint の呼び出しに使用された名前の直後に置かれていた場合と同様に lint によって解釈されます。

lint $LINT_OPTIONS ... other-arguments ...
TMPDIR

通常は /tmp ですが、環境変数 TMPDIR [tmpnam(3S) の tempnam を参照] を設定することにより再定義できます。

NOTEPATH

注釈の定義ファイルを含む指令のコロン区切りのパス (『C ユーザーズガイド』を参照)。

ファイル

lint[12]

第 1 および第 2 パス

lint2n

拡張した第 2 パス

llib-lc.ln

C ライブラリ関数の宣言 (バイナリ形式)

TMPDIR/*lint*

一時ファイル

関連項目

cc (1) , cflow (1) , cxref (1) , exit (2) , make (1S)

C ユーザーズガイド』の lint の章を参照してください。