ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

mlint

MATLAB のコード ファイルの潜在的な問題のチェック

メモ

mlint は推奨されません。代わりに checkcode を使用してください。

代替方法

コード アナライザーでのグラフィカル ユーザー インターフェイスの使用については、エラーと警告についてのコードのチェックを参照してください。

構文

mlint('filename')
mlint('filename','-config=settings.txt')
mlint('filename','-config=factory')
inform=mlint('filename','-struct')
msg=mlint('filename','-string')
[inform,filepaths]=mlint('filename')
inform=mlint('filename','-id')
inform=mlint('filename','-fullpath')
inform=mlint('filename','-notok')
mlint('filename','-cyc')
mlint('filename','-codegen')
mlint('filename','-eml')

説明

mlint('filename') は、filename について、潜在的な問題とコード改良の余地を報告するメッセージを表示します。これらのメッセージは、「コード アナライザー メッセージ」と呼ばれることがあります。メッセージの行番号はハイパーリンクです。クリックするとエディターでその行に直接移動できます。mlint メッセージの正確なテキストは、バージョンにより若干異なる場合があります。

filename は 1 つ以上の文字ベクトルまたは string 配列として、あるいは文字ベクトルの cell 配列として指定します。filename により複数の文字ベクトルまたは string 配列が指定されている場合、あるいは filename が非スカラーの string 配列または文字ベクトルの cell 配列である場合、MATLAB® は各ファイルの情報を表示します。ファイル名の文字ベクトルの cell 配列と、ファイル名の文字ベクトルを連結することはできません。たとえば、入力として {'lengthofline', 'buggy'}, 'collatz' を指定することはできません。

mlint('filename','-config=settings.txt') は、既定のアクティブな設定ファイルをメッセージの表示/非表示を切り替える設定で上書きします。この切り替えは、指定された settings.txt ファイルに示されます。

メモ

-config オプションを付けて指定された settings.txt ファイルを使用する場合には、絶対パスを指定しなければなりません。

settings.txt ファイル作成の詳細については、コード アナライザー メッセージ設定の保存と再利用を参照してください。無効なファイルが指定された場合、関数 mlint は、指定されたファイルを開いたり読み込んだりできないことを示すメッセージを返します。その場合、関数 mlint は出荷時の既定の設定を使用します。

mlint('filename','-config=factory') は、設定ファイルをすべて無視して、出荷時の既定の設定を使用します。

inform=mlint('filename','-struct') は、構造体配列に情報を返します。構造体配列の長さは、検出されたメッセージの数になります。この構造体には、次のフィールドがあります。

フィールド

説明

message

コード解析が検出した問題がありそうな構造を説明するメッセージ。

line

メッセージが参照するファイルの行番号のベクトル。

column

メッセージの適用先となる 2 列配列のファイル列 (列の範囲)。配列の最初の列は、メッセージが開始されるエディターの列を指定します。配列の 2 番目の列は、メッセージが終了するエディターの列を指定します。メッセージ 1 件に対して、2 列配列内の 1 行が割り当てられます。

入力として複数のファイル名が指定された場合、inform には構造体の cell 配列が含められます。

msg=mlint('filename','-string') は情報を文字ベクトル msg として返します。入力として複数のファイル名が指定された場合、msg には各ファイルの情報が含められます。この情報は 10 個の等号文字 (=)、1 つのスペース、ファイル名、1 つのスペース、および 10 個の等号文字で区切られます。

引数 -struct または -string が省略され、出力引数が指定された場合、既定の動作は -struct になります。この引数が省略され、かつ出力引数がない場合には、既定の動作は、コマンド ラインに情報を表示することです。

[inform,filepaths]=mlint('filename') は、ファイル名の絶対パス filepaths を指定された順序で追加して返します。

inform=mlint('filename','-id') はメッセージ ID を要求します。ここで ID は ABC... 形式の文字ベクトルです。構造体へ返した場合、出力は id フィールドももちます。これは、メッセージに付属した ID です。

inform=mlint('filename','-fullpath') は、入力のファイル名が絶対パスであると仮定するため、mlint はそれらのファイルの位置特定を行いません。

inform=mlint('filename','-notok') は、filename 内のすべての行に対して mlint を実行します。mlint を抑制する命令 %#ok で終わる行も対象にします。

mlint('filename','-cyc') は、ファイル内の各関数の McCabe の複雑度 (循環的複雑度とも呼ばれます) を表示します。複雑度が高ければ高いほど、McCabe の複雑度の値も高くなります。しかも、複雑度の値が高いプログラムはエラーになる可能性も高くなります。関数の複雑度を下げるには、より小さくて単純な関数に分割します。一般に、プログラムの複雑度の値が低いほど、理解しやすく変更も容易になります。複雑度の値が 10 を超える場合、プログラムを分割することを勧めるプログラマもいます。

mlint('filename','-codegen') は、コード生成メッセージがコマンド ウィンドウに表示されるようにします。

mlint('filename','-eml') '-eml' は推奨されません。代わりに '-codegen' を使用してください。

次の例では、lengthofline.m を使用します。これは、MATLAB コードに改善の余地があるサンプル ファイルです。これは、matlabroot/help/techdoc/matlab_env/examples に配置されています。これらの例を実行するには、lengthofline.m のコピーを MATLAB パス上の任意の場所に保存します。

オプションなしでファイルに対して mlint を実行する

サンプル ファイル lengthofline.m に対して mlint を実行するには、以下を実行します。

mlint('lengthofline')

MATLAB は lengthofline.m の M-Lint メッセージをコマンド ウィンドウに表示します。

L 22 (C 1-9): The value assigned here to variable 'nothandle' might never be used.
L 23 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 24 (C 5-11): 'notline' might be growing inside a loop. Consider preallocating for speed.
L 24 (C 44-49): Use STRCMPI(str1,str2) instead of using LOWER in a call to STRCMP.
L 28 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 34 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 34 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
                Type 'doc struct' for more information.
L 38 (C 29): Use || instead of | as the OR operator in (scalar) conditional statements.
L 39 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 40 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 42 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 43 (C 13-15): 'dim' might be growing inside a loop. Consider preallocating for speed.
L 45 (C 13-15): 'dim' might be growing inside a loop.Consider preallocating for speed.
L 48 (C 52): There may be a parenthesis imbalance around here.
L 48 (C 53): There may be a parenthesis imbalance around here.
L 48 (C 54): There may be a parenthesis imbalance around here.
L 48 (C 55): There may be a parenthesis imbalance around here.
L 49 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 49 (C 23): Use of brackets [] is unnecessary. Use parentheses to group, if needed.

これらのメッセージとコードの改良方法の詳細は、『MATLAB デスクトップ ツールと開発環境』ドキュメンテーションのコード アナライザー メッセージに基づいてコードを変更するを参照してください。

ID を表示して結果を構造体に返すオプションを付けて mlint を実行する

構造体に結果を格納し、それにメッセージ ID を含めるには、以下を実行します。

inform=mlint('lengthofline', '-id')

MATLAB は、以下を返します。

inform = 

19x1 struct array with fields:
    message
    line
    column
    id

最初のメッセージの値を参照するには、以下を実行します。

inform(1)

MATLAB には、以下のように表示されます。

ans = 

    message: 'The value assigned here to variable 'nothandle' might never be used.'
       line: 22
     column: [1 9]
         id: 'NASGU'

ここで、このメッセージは、ファイルの列 1 ~ 9 から拡張された 22 行目に現れる値についてのメッセージです。NASGU は、メッセージ 'The value assigned here to variable 'nothandle' might never be used.' の ID です。

mlint で McCabe の複雑度を表示する

MATLAB コード ファイルの McCabe の複雑度を表示するには、次の例に示すとおり -cyc オプションを付けて mlint を実行します (lengthofline.m をローカル フォルダーに保存してあると想定)。

mlint lengthofline.m -cyc

コマンド ウィンドウに表示される結果には、次に示すとおりファイルの McCabe の複雑度が示され、その直後に M-Lint メッセージが続きます。

L 1 (C 23-34): The McCabe complexity of 'lengthofline' is 12.
L 22 (C 1-9): The value assigned here to variable 'nothandle' might never be used.
L 23 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 24 (C 5-11): 'notline' might be growing inside a loop. Consider preallocating for speed.
L 24 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 28 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 34 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 34 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD. Type 'doc struct'
 for more information.
L 38 (C 29): Use || instead of | as the OR operator in (scalar) conditional statements.
L 39 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 40 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 42 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 43 (C 13-15): 'dim' might be growing inside a loop. Consider preallocating for speed.
L 45 (C 13-15): 'dim' might be growing inside a loop. Consider preallocating for speed.
L 48 (C 52): There may be a parenthesis imbalance around here.
L 48 (C 53): There may be a parenthesis imbalance around here.
L 48 (C 54): There may be a parenthesis imbalance around here.
L 48 (C 55): There may be a parenthesis imbalance around here.
L 49 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 49 (C 23): Use of brackets [] is unnecessary.  Use parentheses to group, if needed.

使用方法

R2006a より前に導入