Main Content

checkcode

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

説明

メモ

R2022b において: codeIssues は、対話機能が向上していて、特定された問題を保存する機能を備えているため、checkcode よりも推奨されます。

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

checkcode(filename1,...,filenameN) は、指定した個々の filename に関するメッセージを表示します。

checkcode(___,option1,...,optionN) は、指定したオプション フラグに基づいて、返されるメッセージを変更します。たとえば、'-modcyc' を指定して、変更された循環的複雑度を各メッセージと共に返すように要求します。オプションは、前述の構文にある任意の入力引数と共に指定できます。

info = checkcode(___,'-struct') は、情報を n1 列の構造体配列として返します。ここで、n は検出されたメッセージ数です。

msg = checkcode(___,'-string') は情報を文字ベクトルとして返します。

引数 '-struct' または '-string' が省略され、出力引数が指定された場合、既定の動作は '-struct' になります。

[___, filepaths] = checkcode(___) は、ファイル名の絶対パスである filepaths も返します。filepaths は、'-struct' または '-string' のいずれかのオプションと共に指定できます。

すべて折りたたむ

サンプル ファイル lengthofline.m に対して checkcode を実行します。MATLAB® は lengthofline.m に関するコード アナライザー メッセージをコマンド ウィンドウに表示します。

checkcode('lengthofline')
L 21 (C 1-9): Value assigned to variable might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 38 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 39 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 40 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 42 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Add a semicolon after the statement to hide the output (in a function).

サンプル ファイル lengthofline.m に対して checkcode を実行します。メッセージ ID を含めて、結果を構造体に格納します。

info = checkcode('lengthofline', '-id')
info=16×1 struct array with fields:
    id
    message
    fix
    line
    column

最初のメッセージの値を表示します。

info(1)
ans = struct with fields:
         id: 'NASGU'
    message: 'Value assigned to variable might be unused.'
        fix: 0
       line: 21
     column: [1 9]

'-modcyc' オプションを使用して、例のファイル lengthofline.m に対して checkcode を実行します。MATLAB® は lengthofline.m に関するファイルの変更された循環的複雑度とコード アナライザー メッセージを表示します。

checkcode('lengthofline', '-modcyc')
L 1 (C 23-34): The modified cyclomatic complexity of 'lengthofline' is 12.
L 21 (C 1-9): Value assigned to variable might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 38 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 39 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 40 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 42 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Add a semicolon after the statement to hide the output (in a function).

設定ファイルを作成して指定することで、特定のメッセージを非表示にします。たとえば、ファイル lengthofline.m には OR 演算子として || の代わりに | を使用する行がいくつか含まれています。既定で、checkcode はこれらの行にフラグを設定します。

checkcode('lengthofline')
L 21 (C 1-9): Value assigned to variable might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 38 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 39 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 40 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 42 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Add a semicolon after the statement to hide the output (in a function).

OR 演算子として | が使用されていることを示すメッセージを非表示にする設定ファイルを作成します。

  1. [ホーム] タブの [環境] セクションで [基本設定] ボタンをクリックします。

  2. 左のペインで [コード アナライザー] を選択します。

  3. [既定の設定] の下の [外観と可読性] セクションで、[(スカラーの) 条件文の OR 演算子として | の代わりに || を使用してください。] というメッセージをオフにします。

  4. ファイル名として mysettings.txt を入力し、現在のフォルダーに保存します。

  5. [キャンセル] ボタンをクリックして、アクティブな設定を変更せずに [基本設定] パネルを閉じます。

カスタム設定ファイル mysettings.txt を使用して、サンプル ファイルに対して checkcode を実行します。メッセージ「 (スカラーの) 条件文の OR 演算子として | の代わりに || を使用してください。」は抑制され、それ以降、メッセージのリストに表示されなくなります。

checkcode('lengthofline','-config=mysettings.txt')
L 21 (C 1-9): Value assigned to variable might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 38 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 39 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 40 (C 17-45): To improve performance, use 'isscalar' instead of length comparison.
L 42 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): Variable appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Add a semicolon after the statement to hide the output (in a function).

入力引数

すべて折りたたむ

ファイル名。文字ベクトル、string 配列、または文字ベクトルの cell 配列として指定します。ファイル名には部分パスを含めることができますが、検索パス上のフォルダーまたは現在のフォルダー内になければなりません。

filename が非スカラーの string 配列または文字ベクトルの cell 配列である場合、MATLAB® は各ファイルの情報を表示します。

メモ

ファイル名の cell 配列と文字配列を連結することはできません。たとえば、入力として {'lengthofline', 'buggy'}, 'collatz' を指定することはできません。

例: 'lengthofline'

例: {'lengthofline', 'buggy'}

データ型: char | string

表示オプション。次の値のいずれかとして指定します。オプションの順番は任意です。

オプション説明
'-id'メッセージ ID を要求します。ここで ID は文字ベクトルです。構造体へ返した場合、出力は id フィールドももちます。これは、メッセージに付属した ID です。
'-fullpath' 入力されたファイル名が絶対パスであると仮定します。したがって checkcode はファイルの位置特定を試行しません。
'-notok'

filename 内のすべての行に対して checkcode を実行します。checkcode の抑制命令 %#ok で終わる行も対象にします。

%#ok およびプログラム内からのメッセージの抑制については、コード アナライザー メッセージ インジケーターとメッセージの調整を参照してください。

'-cyc'

ファイル内にある各関数の McCabe の循環的複雑度を表示します。一般に、複雑度の値が低いほど、プログラムは理解しやすく変更も容易です。複雑度の値が高いほど、プログラムにエラーが含まれる可能性が高いことは証拠により示唆されています。関数の複雑度を下げるには、より小さくて単純な関数に分割します。複雑度の値が 10 を超える場合、プログラムの分割が推奨されることもあります。

循環的複雑度の詳細については、循環的複雑度を使用したコードの複雑度の測定を参照してください。

'-modcyc'

ファイル内にある各関数の変更された循環的複雑度を表示します。関数の変更された循環的複雑度は、McCabe の循環的複雑度と等しくなりますが、1 つの違いがあります。McCabe の循環的複雑度では、switch ステートメント内の個々の case がそれぞれ 1 としてカウントされますが、変更された循環的複雑度では、switch ステートメント全体が 1 としてカウントされます。一般に、switch ステートメントは入れ子にされた if-elseif-else ステートメントより単純であるため、多くの場合、変更された循環的複雑度のほうがコードの複雑度の測定に適していると考えられます。

循環的複雑度の詳細については、循環的複雑度を使用したコードの複雑度の測定を参照してください。

'-config=settingsfile'

'-config=factory'

指定した設定ファイルで既定のアクティブな設定ファイルをオーバーライドします。指定したファイルが現在のフォルダーにない場合は、ファイルへの絶対パスを指定します。

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

設定ファイルをすべて無視して、出荷時の既定の基本設定を使用するには、'-config=factory' を指定します。

出力引数

すべて折りたたむ

メッセージの情報。n1 列の構造体配列として返されます。ここで、ncheckcode コマンドで返されるメッセージの数です。複数のファイル名が入力された場合、あるいは cell 配列が入力された場合、info は構造体の cell 配列を含みます。

フィールド

説明

message

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

line

行番号のベクトル。ファイル内でメッセージが適用される行を示します。

column

列番号からなる 2 列配列 (列の範囲)。ファイル内でメッセージが適用される列を示します。配列の最初の列は、メッセージが開始されるエディターの列を指定します。配列の 2 番目の列は、メッセージが終了するエディターの列を指定します。2 列配列内で、メッセージの各出現箇所につき 1 行が使用されます。

メッセージの情報。文字ベクトルとして返されます。複数のファイル名が入力された場合、あるいは cell 配列が入力された場合、msg は文字ベクトルを含み、各ファイルの情報は 10 個の等号文字、1 つのスペース、ファイル名、1 つのスペースおよび 10 個の等号文字で区切られます。

例: ========== C:\MyMatlabFiles\buggy.m ==========

ファイルの絶対パス。文字ベクトルの cell 配列として指定します。MATLAB は、指定された入力ファイルと同じ順序で filepaths をリストします。

ヒント

コード行を無視するようコード アナライザーに強制するには、その行の末尾に %#ok を使用します。このタグの後にコメントを追加できます。

unsuppressed1 = 10 	% This line will get caught
suppressed2 = 20		%#ok This line will not get caught
suppressed3 = 30		%#ok This line will not get caught

拡張機能

バージョン履歴

R2011b で導入