2016-12-20 1 views
6

Matlab code-analyseur a beaucoup de bonnes suggestions sur la façon de corriger les erreurs et les inefficacités, mais je rencontre parfois des situations que je voudrais être pris par l'analyseur. Plus précisément, je pense à un code comme le suivant:Puis-je créer des avertissements de code-analyseur matlab personnalisés?

if numel(list > x) 
    ... 
end 

Je ne peux pas du haut de ma tête penser à une situation où je dois utiliser le code ci-dessus alors que le code suivant:

if numel(list) > x 
    ... 
end 

est assez souvent utilisé. J'ai regardé la liste des choses possibles que l'analyseur de code pourrait me prévenir et je n'ai pas trouvé cette possibilité. Donc, ma question est la suivante: est-il possible d'ajouter mes propres avertissements à l'analyseur de code, et si oui, comment?

Je me rends compte que si cela est possible, cela pourrait être une tâche difficile, donc des alternatives ou des solutions de contournement pour le problème spécifique seraient également appréciées!

+0

Vous devriez jeter un coup d'oeil à cet article (http://undocumentedmatlab.com/blog/parsing-mlint-code-analyzer-output) – obchardon

Répondre

2

Je ne crois pas qu'il existe un moyen d'ajouter de nouveaux modèles de code pour le MATLAB Code Analyzer à rechercher. Tout ce que vous pouvez faire est de définir quels avertissements existants sont affichés ou supprimés. Je ne suis pas sûr de savoir quel type d'outils tiers il pourrait y avoir pour l'analyse de code, et créer un analyseur généraliste vous-même serait assez décourageant. Cependant, s'il y avait quelques motifs très spécifiques et bien définis que vous vouliez essayer de mettre en évidence dans votre code, vous pourriez tenter de l'analyser avec regular expressions (cue effrayante musique et crier).

Cela peut souvent être difficile, mais faisable. Par exemple, j'ai écrit ce morceau de code qui cherche le motif que vous mentionnez ci-dessus. L'une des choses qui a souvent à gérer lorsque vous faites quelque chose comme ceci est la comptabilité pour des ensembles de parenthèses enserrant, que je poignée en retirant d'abord les paires non-intéressantes entre parenthèses et leur contenu:

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) 

Avis Je glissai cas de test dans les commentaires au bas du fichier. Quand je lance ce code sur lui-même, je reçois ceci:

>> 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. 

avis qu'un message est répertorié pour la première, quatrième et sixième cas de test qui correspondent à votre code erroné (deux fois pour le sixième cas de test, car il sont deux erreurs sur cette ligne).

Est-ce que cela fonctionnera dans toutes les situations possibles? Je suppose que non. Vous devrez probablement augmenter la complexité des modèles regex pour gérer d'autres situations. Mais au moins cela peut servir d'exemple du genre de choses que vous devez prendre en compte lors de l'analyse du code.