2016-12-20 5 views
6

У анализатора кода Matlab есть много хороших предложений о том, как исправить ошибки и неэффективность, но иногда я сталкиваюсь с ситуациями, которые я бы хотел поймать анализатором. В частности, я имею в виду код, как следующее:Могу ли я создавать пользовательские предупреждения для кода-анализатора 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) 

Примечание я добавил тестовые примеры в комментариях в нижней части файла. Когда я запускаю этот код на себя, я получаю это:

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

Обратите внимание, что сообщение в список для первого, четвертого и шестого тестовых, которые соответствуют вашему ошибочному коду (дважды для шестого теста, так как две ошибки на этой линии).

Будет ли это работать во всех возможных ситуациях? Я бы предположил, что нет. Вероятно, вам придется увеличить сложность шаблонов регулярных выражений для обработки дополнительных ситуаций. Но, по крайней мере, это может служить примером того, что вы должны учитывать при анализе кода.