Jen*_*sen 6 matlab code-analysis
关于如何纠正错误和低效率的matlab代码分析器有很多很好的建议,但我有时会遇到我想被分析器捕获的情况.具体来说,我正在考虑如下代码:
if numel(list > x)
...
end
Run Code Online (Sandbox Code Playgroud)
我无法想到我需要使用上述代码的任何情况,而以下代码:
if numel(list) > x
...
end
Run Code Online (Sandbox Code Playgroud)
经常使用.
我查看了代码分析器可能警告我的可能事项列表,但我没有发现这种可能性.
所以我的问题是:是否可以将自己的警告添加到代码分析器中,如果可以,如何添加?
我意识到,如果可能这可能是一项艰巨的任务,那么对于特定问题的任何替代方案或解决方案建议也将受到赞赏!
我不认为有办法添加新的代码模式供MATLAB 代码分析器查找。您所能做的就是设置显示或抑制哪些现有警告。
我不确定有什么样的第三方工具可用于代码分析,并且自己创建一个通用分析器将是相当令人畏惧的。然而,如果您想在代码中尝试并突出显示一些非常具体的、定义明确的模式,您可以尝试使用正则表达式来解析它(提示可怕的音乐和尖叫声)。
这通常很困难,但可行。作为一个例子,我编写了这段代码来查找您上面提到的模式。在执行此类操作时,经常需要管理的事情之一是考虑括号集,我通过首先删除不感兴趣的括号对及其内容来处理:
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)
Run Code Online (Sandbox Code Playgroud)
请注意,我在文件底部的注释中添加了一些测试用例。当我对其自身运行此代码时,我得到以下信息:
>> 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.
Run Code Online (Sandbox Code Playgroud)
请注意,针对与您的错误代码匹配的第一个、第四个和第六个测试用例列出了一条消息(第六个测试用例两次,因为该行上有两个错误)。
这适用于所有可能的情况吗?我认为不会。您可能必须增加正则表达式模式的复杂性才能处理其他情况。但至少这可以作为解析代码时必须考虑的事情的一个例子。