matlab - 我可以制作自定义 matlab 代码分析警告吗?

标签 matlab code-analysis

matlab 代码分析器有很多关于如何纠正错误和低效率的好建议,但我有时会遇到我想被分析器捕获的情况。具体来说,我正在考虑如下代码:

if numel(list > x)
  ...
end

我想不出在任何情况下我需要使用上面的代码而下面的代码:

if numel(list) > x
  ...
end

经常使用。

我查看了代码分析器可能警告我的可能事项列表,但我没有发现这种可能性。

所以我的问题是:是否可以将我自己的警告添加到代码分析器中,如果可以,怎么做?

我意识到,如果可能的话,这可能是一项艰巨的任务,因此对于特定问题的任何替代方案或解决方法建议也将不胜感激!

最佳答案

我认为没有办法为 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.

请注意,为匹配您的错误代码的第一个、第四个和第六个测试用例列出了一条消息(第六个测试用例两次,因为该行有两个错误)。

这是否适用于所有可能的情况?我假设不会。您可能必须增加正则表达式模式的复杂性才能处理其他情况。但至少这可以作为您在解析代码时必须考虑的事情的一个例子。

关于matlab - 我可以制作自定义 matlab 代码分析警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41242635/

相关文章:

matlab - 使用 LIBSVM 进行一对多分类。软件

matlab - 如何计算多元正态概率密度函数的导数

matlab - 调用 matlab 函数而不带其所有参数

image - Matlab - 注册和裁剪来自两个不同来源的对齐图像

c++ - 来自 C++ 源代码的统计信息

c# - 序列化集合并遵守代码分析

c# - 使用 String.ToUpperInvariant() 规范化字符串

oop - 对 Matlab 中的类 get 函数返回的数据数组进行寻址

java - 在 Eclipse 中跨文件搜索注释掉的代码

c++ - 有没有办法找出 C 函数的主要调用者?