Я не верю, что есть способ добавить новые шаблоны кода для 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.
Обратите внимание, что сообщение в список для первого, четвертого и шестого тестовых, которые соответствуют вашему ошибочному коду (дважды для шестого теста, так как две ошибки на этой линии).
Будет ли это работать во всех возможных ситуациях? Я бы предположил, что нет. Вероятно, вам придется увеличить сложность шаблонов регулярных выражений для обработки дополнительных ситуаций. Но, по крайней мере, это может служить примером того, что вы должны учитывать при анализе кода.
Вы должны посмотреть на это [статья] (http://undocumentedmatlab.com/blog/parsing-mlint-code-analyzer-output) – obchardon