Oracle® Developer Studio 12.5: C ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

5.3 lint のコマンド行オプション

lint プログラムは、静的なアナライザです。そのため、検出した依存性に関する実行時の結果を評価できません。たとえば、特定のプログラム内に到達不可能な break 文が数百個含まれており、それらは重要度が低いにもかかわらず、lint によってフラグが付けられるものとします。たとえば、lint のコマンド行オプションやソーステキスト内にコメントとして埋め込まれる特殊な指令を、次のように使用できます。

  • -b オプションを指定して lint を呼び出すと、到達不可能な break 文に関するすべてのエラーメッセージが抑制されます。

  • 到達不可能な文に対する診断を抑制するには、コメント /*NOT REACHED*/ をその文の前に付けます。

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

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

5.3.1 -#

冗長モードを有効にし、呼び出されるときに各コンポーネントを表示します。

5.3.2 -###

呼び出すごとに各コンポーネントを表示しますが、実際には実行しません。

5.3.3 -a

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

5.3.4 -b

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

5.3.5 -C filename

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

5.3.6 -c

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

5.3.7 -dirout=dir

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

5.3.8 -err=warn

-err=warn は、-errwarn=%all 用のマクロです。-errwarn=tを参照してください。

5.3.9 -errchk=l(, l)

l で指定した追加の検査を実行します。デフォルトは、-errchk=%none です。-errchk を指定することは、-errchk=%all を指定することと同等です。l は、次の表にあるフラグ (-errchk=longptr64,structarg など) のうちの 1 つまたは複数で構成される検査のコンマ区切りリストです。

表 8  -errchk のフラグ
意味
%all
-errchk による検査をすべて実行します。
%none
-errchk による検査を行いません。これはデフォルト値です。
[no%]locfmtchk
printf のような書式文字列を lint の第 1 のパスで検査します。-errchk=locfmtchk を使用するかどうかには関係なく、lint は常に、printf のような書式文字列をその第 2 のパスで検査します。
[no%]longptr64
long 整数およびポインタのサイズが 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
$
[no%]structarg
値渡しされた構造体引数を検査します。仮引数の型が不明の場合は、その旨が報告されます。
[no%]parentheses
コード内の優先順位を明確に検査します。このオプションは、コードの保守性を高めるために使用します。-errchk=parentheses で警告が返された場合は、さらに括弧を使用して、コード内の演算の優先順位を明確に指示することを検討してください。
[no%]signext
符号なし整数型の式における符号付き整数値の符号拡張を、ISO C の通常の値保持規則が認める状態について検査します。このオプションは、-errchk=longptr64 が一緒に指定された場合にはエラーメッセージを出力するだけです。
[no%]sizematch
小さな整数に大きな整数が代入される場合について検査し、警告します。これらの警告は、サイズが同じであっても符号が異なる整数間の代入 (unsigned intsigned int を取得する) についても発行されます。

5.3.10 -errfmt=f

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

表 9  -errfmt のフラグ
意味
macro
マクロを展開して、エラーのあるソースコード、行番号、場所を表示します。
simple
エラーのある行番号と場所番号 (大括弧内) を表示し、1 行の (簡単な) 診断メッセージを示します。-s オプションと同様ですが、エラー位置に関する情報が入っています。
src
エラーのあるソースコード、行番号、場所を表示します。マクロは展開しません。
tab
表形式で表示します。これはデフォルト値です。

デフォルトは -errfmt=tab です。-errfmt を指定することは、-errfmt=tab を指定することと同等です。

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

5.3.11 -errhdr=h

-Ncheck も指定した場合に、lint でヘッダーファイルの特定のメッセージを報告できるようにします。h は、dirno%dir%all%none%user のうちの 1 つまたは複数で構成されるコンマ区切りリストです。

表 10  -errhdr のフラグ
意味
dir
ディレクトリ dir からインクルードされたヘッダーファイル用の -Ncheck のメッセージを報告します。
no%dir
ディレクトリ dir からインクルードされたヘッダーファイル用の -Ncheck のメッセージを報告しません。
%all
使用されているすべてのヘッダーファイルを検査します。
%none
ヘッダーファイルを検査しません。
%user
使用されているすべてのユーザー定義のヘッダーファイル、すなわち /usr/include およびそのサブディレクトリに入っているヘッダーファイルとコンパイラが提供しているヘッダーファイルを除く、すべてのヘッダーファイルを検査します。これはデフォルト値です。

例:

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

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

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

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

5.3.12 -erroff=tag(, tag)

lint エラーメッセージを抑制するか、または有効にします。

t には、次の 1 つまたは複数の項目をコンマで区切って指定します。tagno%tag%all%none

表 11  -erroff のフラグ
意味
tag
tag で指定したメッセージを抑制します。-errtags=yes オプションで、メッセージのタグを表示できます。
no%tag
tag で指定したメッセージを使用可能にします。
%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

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

5.3.13 -errsecurity=level

-errsecurity オプションを使用して、コードのセキュリティーに問題がないか検査することができます。

level は、次の表に示す値のいずれかでなければいけません。

表 12  -errsecurity のフラグ
level の値
意味
core
このレベルでは、たいていの場合で安全でない、または検査することの難しいソースコードの構文がないかどうかを検査します。このレベルで行われる検査には次のものがあります。
  • printf() および scanf() 系の関数での変数書式文字列の使用

  • scanf() 関数における非結合文字列 (%s) 形式の使用

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

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

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

standard
このレベルには、core レベルのすべての検査に加えて、安全かもしれないが、より良い別の方法がある構文のすべての検査が含まれます。新しく作成したコードを検査をするときは、このレベルを推奨します。このレベルで追加される検査には、次のものがあります。
  • strlcpy() 以外の文字列コピー関数の使用

  • 脆弱な乱数関数の使用

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

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

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

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

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

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

  • exec() 系の関数の使用

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

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

%none
-errsecurity の検査を無効にします。

-errsecurity の値が指定されていない場合は、-errsecurity=%none に設定されます。-errsecurity は指定されているが、引数が指定されていない場合は、-errsecurity=standard に設定されます。

5.3.14 -errtags=a

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

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

5.3.15 -errwarn=t

指定された警告メッセージが表示された場合、lint はエラーステータスを返して終了します。t は、tagno%tag%all%none の 1 つまたは複数をコンマで区切って指定したリストです。タグの順番が重要です。たとえば %all,no%tag では、tag 以外の警告が発行されると、lint が致命的なステータスで終了します。次の表は、-errwarn 値の一覧を示しています。

表 13  -errwarn のフラグ
tag
意味
tag
tag に指定されたメッセージが警告メッセージとして発行された場合、lint は致命的なエラーステータスで終了します。tag に指定されたメッセージが発行されない場合は無効です。
no%tag
タグに指定されたメッセージが警告メッセージとしてだけ発行された場合に、lint が致命的なエラーステータスで終了することがないようにします。tag に指定されたメッセージが発行されない場合は無効です。このオプションは、tag または %all を使用して以前に指定されたメッセージが警告メッセージとして発行されても lint が致命的なエラーステータスで終了しないようにする場合に使用してください。
%all
どのような警告メッセージが発行されても、lint が致命的なエラーステータスで終了するようにします。%all に続いて no%tag を使用して、特定の警告メッセージを対象から除外することもできます。
%none
どの警告メッセージが発行されても lint が致命的なエラーステータスで終了することがないようにします。

デフォルトは -errwarn=%none です。-errwarn のみを指定することは、-errwarn=%all と同義です。

5.3.16 -F

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

5.3.17 -fd

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

5.3.18 -flagsrc=file

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

5.3.19 -h

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

5.3.20 -Idir

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

5.3.21 -k

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

5.3.22 -Ldir

-l とともに使用された場合は、ディレクトリ dir 内の lint ライブラリを検索します。

5.3.23 -lx

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

5.3.24 -m

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

5.3.25 -m32|-m64

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

32 ビット C プログラムの確認には –m32 を使用し、64 ビット C プログラムの確認には –m64 を使用します。

ILP32 データ型モデル (32 ビット int、long、ポインタデータ型) は、すべての Oracle Solaris プラットフォームと、64 ビットに対応していない Oracle Linux プラットフォームでのデフォルトです。LP64 データ型モデル (64 ビット long、ポインタデータ型) は、64 ビットに対応している Oracle Linux プラットフォームでのデフォルトです。–m64 は、LP64 モデルに対応しているプラットフォームでのみ許可されます。


注 -  Sun Studio 12 のリリースの前は、–Xarch オプションの選択によって、データ型モデル (ILP32 または LP64) が暗黙的に指定されました。この動作は行われなくなりました。ほとんどのプラットフォームでは、コマンド行に –m64 を追加するだけで 64 ビットプログラムで lint を実行することができます。

5.3.26 -Ncheck=c

ヘッダーファイル内で対応する宣言を検査し、マクロを検査します。 c は、macroextern%all%noneno%macrono%extern の 1 つまたは複数をコンマで区切って指定したリストです。

表 14  -Ncheck フラグ
意味
macro
ファイル間でのマクロ定義の一貫性を検査します。
extern
ソースファイルとそれに関連するヘッダーファイルとの間の宣言の 1 対 1 対応を検査します (たとえば file1.cfile1.h)。ヘッダーファイル内で余分なまたは見つからない extern 宣言がないことを確認します。
%all
-Ncheck のすべての検査を実行します
%none
-Ncheck のどの検査も実行しません。これはデフォルト値です。
no%macro
-Ncheck のどの macro 検査も実行しません
no%extern
-Ncheck のどの extern 検査も実行しません

デフォルトは -Ncheck=%none です。-Ncheck を指定することは、-Ncheck=%all を指定することと同等です。

各値をコンマで結合できます (-Ncheck=extern,macro など)。

次の例は、マクロ検査以外のすべての検査を実行します。

% lint -Ncheck=%all,no%macro

5.3.27 -Nlevel=n

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

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

基本および拡張 lint 使用方法 モードについては、Using lintを参照してください。

5.3.27.1 -Nlevel=1

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

5.3.27.2 -Nlevel=2

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

5.3.27.3 -Nlevel=3

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

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

そのあと、解析の結果として受け取った集合は、次のアルゴリズムに従って誤りがないか評価されます。

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

5.3.27.4 -Nlevel=4

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

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

5.3.28 -n

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

5.3.29 -ox

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

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

5.3.30 -p

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

5.3.31 -Rfile

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

5.3.32 -s

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

5.3.33 -u

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

5.3.34 -V

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

5.3.35 -v

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

5.3.36 -Wfile

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

5.3.37 -XCC=a

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


注 -  このオプションは、-std=c89 が有効な場合にだけ使用する必要があります。

5.3.38 -Xalias_level[=l ]

このオプションでは、lanybasicweaklayoutstrictstdstrong のいずれかです。さまざまなレベルの明確化の詳細な説明については、表 49を参照してください。

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

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

明確化の詳細と、明確化を支援するために作成されたプラグマのリストについては、lint フィルタを参照してください。

5.3.39 -Xarch=v9

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

5.3.40 -Xc99[=o]

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

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

-Xc99=none は、C99 機能の認識を無効にします。-Xc99=all は、サポートされている C99 機能の認識を有効にします。

引数を付けずに -Xc99 を指定すると、-Xc99=all と同等の結果になります。

-std または -xlang フラグが指定されている場合、-Xc99 フラグは使用できません。

5.3.41 -Xkeeptmp=a

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

5.3.42 -Xtemp=dir

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

5.3.43 -Xtime=a

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

5.3.44 -Xtransition=a

K&R C と Oracle Developer Studio ISO C の違いに関する警告を発行します。a には、yes または no のどちらかを指定できます。デフォルトは -Xtransition=no です。-Xtransition を指定することは、-Xtransition=yes を指定することと同等です。

5.3.45 -Xustr={ascii_utf16_ushort| no}

このオプションは、U"ASCII 文字列" 書式の文字列リテラルの認識を unsigned short int の配列として有効にします。デフォルトは -Xustr=no で、U"ASCII 文字列" 文字列リテラルのコンパイラ認識を無効にします。-Xustr=ascii_utf16_ushort は、U"ASCII 文字列" 文字列リテラルのコンパイラ認識を有効にします。

5.3.46 -x

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

5.3.47 -y

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