2016-12-20 11 views
6

matlab code-analyzerには、エラーや非効率を修正する方法についてたくさんの提案がありますが、私は時々アナライザに捕まえたいという状況に遭遇します。具体的に私は、次のようなコードを考えています:カスタムMATLABコードアナライザの警告を作成できますか?

if numel(list > x) 
    ... 
end 

私は私の頭の上から、私は次のコードに対し、上記のコードを使用する必要がどのような状況を考えることはできません。

if numel(list) > x 
    ... 
end 

が頻繁に使用されます。

コードアナライザが私に警告する可能性のある項目のリストを調べましたが、この可能性は見つかりませんでした。

私の質問です:私自身の警告をコードアナライザに追加することは可能ですか?

可能であれば、それは困難な作業である可能性があることを認識しているので、特定の問題の代替案や回避策もありがとうございます。

+0

この[記事](http://undocumentedmatlab.com/blog/parsing-mlint-code-analyzer-output) – obchardon

答えて

2

MATLAB Code Analyzerが検索する新しいコードパターンを追加する方法はないと思います。既存の警告を表示または非表示にすることができます。

私は、コード分析のためにどのようなサードパーティのツールが存在するのかよく分かりません。汎用アナライザを自分で作成するのは難しいでしょう。 しかし、の場合、コード内で強調表示したいと思っていた非常に具体的で明確なパターンがいくつかあった場合は、regular expressions(悲惨な音楽と叫び声)で解析することができます。

これはしばしば困難ですが、実行可能です。例として、上記のパターンを探すこのコードを書いた。私は最初の非興味深い括弧のペアとその内容を削除することによって扱うことが多い括弧のセットを占めている。このような何かをやったときに管理する必要があるものの一つは:

function check_code(filePath) 

    % Read lines from the file: 
    fid = fopen(filePath, 'r'); 
    codeLines = textscan(fid, '%s', 'Delimiter', '\n'); 
    fclose(fid); 
    codeLines = codeLines{1}; 

    % Remove sets of parentheses that do not encapsulate a logical statement: 
    tempCode = codeLines; 
    modCode = regexprep(tempCode, '\([^\(\)<>=~\|\&]*\)', ''); 
    while ~isequal(modCode, tempCode) 
    tempCode = modCode; 
    modCode = regexprep(tempCode, '\([^\(\)<>=~\|\&]*\)', ''); 
    end 

    % Match patterns using regexp: 
    matchIndex = regexp(modCode, 'numel\([^\(\)]+[<>=~\|\&]+[^\(\)]+\)'); 

    % Format return information: 
    nMatches = cellfun(@numel, matchIndex); 
    index = find(nMatches); 
    lineNumbers = repelem(index, nMatches(index)); 
    fprintf('Line %d: Potential incorrect use of NUMEL in logical statement.\n', ... 
      lineNumbers); 

end 
% Test cases: 
% if numel(list < x) 
% if numel(list) < x 
% if numel(list(:,1)) < x 
% if numel(list(:,1) < x) 
% if (numel(list(:,1)) < x) 
% if numel(list < x) & numel(list < y) 
% if (numel(list) < x) & (numel(list) < y) 

お知らせ私はいくつかを追加しましたテストケースをファイルの最後のコメントに追加します。メッセージは、第1〜第4、およびそこ以来、二回第六テストケースのために(自分の誤ったコードと一致し第六テストケースのためにリストされていることを

>> check_code('check_code.m') 
Line 28: Potential incorrect use of NUMEL in logical statement. 
Line 31: Potential incorrect use of NUMEL in logical statement. 
Line 33: Potential incorrect use of NUMEL in logical statement. 
Line 33: Potential incorrect use of NUMEL in logical statement. 

お知らせ:私は自分自身にこのコードを実行すると、私はこれを取得しますその行には2つのエラーがあります)。

これはすべての状況で機能しますか?私はそうしないだろう。追加の状況に対処するために、正規表現パターンの複雑さを増やさなければならない可能性が高くなります。しかし、少なくともこれは、コードを解析する際に考慮する必要のある種類の例として役立ちます。

関連する問題