2016-12-20 6 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. 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^