Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

检查代码中的错误和警告

MATLAB® 代码分析器可自动检查您的代码有无编码问题。

在编辑器和实时编辑器中自动检查代码 - 代码分析器

您可以查看有关您代码的警告和错误消息,并基于这些消息修改您的文件。这些消息会自动持续更新,因此您可以看到您的更改是否解决了消息中指明的问题。某些消息提供其他信息和/或自动代码更正。

启用持续代码检查

要在编辑器和实时编辑器中的 MATLAB 代码文件中启用持续代码检查,请执行以下操作:

  1. 主页选项卡上的环境部分中,点击 预设

  2. 选择 MATLAB > 代码分析器,然后选中启用集成警告和错误消息复选框。

  3. 下划线选项设置为“为警告和错误添加下划线”,然后点击确定

使用持续代码检查

您可以在编辑器和实时编辑器中的 MATLAB 代码文件中使用持续代码检查:

  1. 在编辑器或实时编辑器中打开一个 MATLAB 代码文件。此示例使用 MATLAB 软件随附的示例文件 lengthofline.m

    1. 打开该示例文件:

      open(fullfile(matlabroot,'help','techdoc','matlab_env',...
           'examples','lengthofline.m'))
      
    2. 将该示例文件保存至您对其有写访问权限的文件夹。例如,将 lengthofline.m 保存至 C:\my_MATLAB_files

  2. 检查消息栏顶部的消息指示标记,以查看报告的有关该文件的代码分析器消息:

    • 红色指示检测到语法错误或其他重大问题。

    • 橙色指示检测到警告或改进之处,但未检测到错误。

    • 绿色指示未检测到任何错误、警告或改进机会。

    在此示例中,指示条是红色,意味着文件中至少有一个错误。

  3. 点击消息指示标记以转到包含消息的下一代码片段。下一代码片段是相对于当前光标位置来定位的,可在状态栏中查看。

    lengthofline 示例中,第一条消息是在第 21 行。光标移至第 21 行的开头。

    其中存在消息的代码片段以红色(表示错误)或橙色(表示警告和改进机会)下划线标出。

  4. 可通过在带有下划线的代码片段内移动鼠标指针来查看该消息。

    该消息以工具提示形式打开并包含一个详细信息按钮,通过该按钮可展开消息,获取更多信息。并非所有消息都有附加信息。

  5. 点击详细信息按钮。

    窗口将扩大以显示说明和用户操作。

  6. 根据需要修改代码。

    消息指示标记和下划线会自动更新,以反映您所做的更改,即使您不保存文件也如此。

  7. 在第 27 行上,将指针悬停在 prod 上。

    该代码带有下划线,这是因为有一个警告消息,并且它是高亮显示的,这是因为可进行自动修复。当您查看该消息时,它提供一个按钮来应用自动修复。

  8. 通过执行以下操作之一修复该问题:

    • 如果您知道修复的内容(根据以前的经验),请点击修复

    • 如果您不熟悉修复,可查看修复内容,然后按如下所示进行应用:

      1. 右键点击高亮显示的代码(对于单键鼠标,按 Ctrl 并点击),然后查看上下文菜单中的第一项。

      2. 点击修复。

        MATLAB 会自动更正代码。

        在此示例中,MATLAB 将 prod(size(hline)) 替换为 numel(hline)

  9. 通过执行以下操作之一转到其他消息:

    • 要转到下一消息,请点击消息指示标记或下一个带下划线的代码片段。

    • 要转到标记表示的行,请在指示标记条中点击红色或橙色的行。

      要查看 lengthofline 中的第一个错误,请点击消息栏中的第一个红色标记。光标移至第 47 行中的第一个可疑代码片段。详细信息修复按钮灰显(如果是在 MATLAB Online™ 中,则不可见),指示不存在有关此消息的更多信息且没有自动修复。

      多条消息可能代表存在一个问题或多个问题。解决一个问题或许能解决所有问题,或者在解决一个问题后,其他消息可能有变化,或者您需要采取的操作可能变得更清晰。

  10. 修改代码以解决消息中指明的问题 - 消息指示标记会自动更新。

    该消息指示在第 47 行存在分隔符不平衡问题。要研究此消息,请在编辑器或实时编辑器中将箭头键移到各个分隔符上,查看 MATLAB 是否指示不匹配。有关如何在使用箭头键时启用分隔符匹配的说明,请参阅设置键盘预设项

    代码看起来没有任何不匹配的分隔符。但是,代码分析检测到圆括号中有分号:data{3}(;),并将其解释为语句结束符。该消息报告第 47 行上的两个语句都存在分隔符不平衡问题。

    要解决此问题,请在第 47 行中将 data{3}(;) 更改为 data{3}(:)。现在,下划线不再显示在第 47 行中。在第 47 行中进行一次更改即可解决两条消息中的问题。因为通过更改移除了文件中的唯一错误,所以栏顶部的消息指示标记从红色变为橙色,指示只存在警告和潜在改进机会。

在修改代码以解决所有消息中的问题或禁用指定消息后,消息指示标记变为绿色。所有消息均得到解决的示例文件已另存为 lengthofline2.m。使用以下命令打开更正后的示例文件:

open(fullfile(matlabroot,'help','techdoc',...
     'matlab_env', 'examples','lengthofline2.m'))

创建代码分析器消息报告

您可以使用以下方法之一为单个文件创建一个消息报告,或为文件夹中的所有文件创建一个消息报告:

  • 为单个 MATLAB 代码文件运行一个报告:

    1. 在编辑器窗口中,点击 并选择显示代码分析器报告

      代码分析器报告随即显示在 MATLAB Web 浏览器中。

    2. 基于报告中的消息修改您的文件。

    3. 保存文件。

    4. 重新运行该报告,以查看您的更改是否解决了消息中指明的问题。

    不支持在实时编辑器中为单个文件创建报告。

  • 对文件夹中的所有文件运行报告:

    1. 在当前文件夹浏览器上,点击

    2. 选择报告 > 代码分析器报告

    3. 基于报告中的消息修改您的文件。

      有关详细信息,请参阅MATLAB 代码分析器报告

    4. 保存修改后的文件。

    5. 重新运行该报告,以查看您的更改是否解决了消息中指明的问题。

调整代码分析器消息指示标记和消息

根据您在完成 MATLAB 文件时所处的阶段,您可能需要限制代码下划线标记的使用。您可以使用步骤 1 的检查代码中的错误和警告中引用的代码分析器预设执行此操作。例如,首次编码时,您可能希望只对错误使用下划线,这是因为警告会带来纷扰。

代码分析并不提供关于每一情形的完美信息,有时,您可能不需要根据消息更改代码。如果您不想更改代码,并且不希望看到该行的标记和消息,可隐藏它们。对于 lengthofline 示例,在第 48 行中,第一条消息是 Terminate statement with semicolon to suppress output (in functions)。在语句末尾添加分号隐藏输出,这是一种常见做法。针对生成输出但缺少终止分号的行,代码分析可向您发出警报。如果您想查看第 48 行后的输出,请不要按消息指示添加分号。

可通过一些不同方法隐藏(关闭)警告和错误消息指示标记:

您不能隐藏诸如语法错误之类的错误消息。因此,有关隐藏消息的说明不适用于这些类型的消息。

在当前文件中隐藏消息实例

您可以在当前文件中隐藏代码分析器消息的特定实例。例如,使用检查代码中的错误和警告中显示的代码,执行下列步骤:

  1. 在第 48 行,在第一个下划线处右键点击(对于单键鼠标,按 Ctrl 并点击)。

  2. 从上下文菜单中,选择取消‘使用分号终止语句...’ > 在此行中

    注释 %#ok<NOPRT> 出现在行尾,指示 MATLAB 隐藏该行的 Terminate statement with semicolon to suppress output (in functions) 代码分析器消息。该消息的下划线和指示标记条中对应的标记随即消失。

  3. 如果某行上有两条您不希望显示的消息,请在每个下划线处分别右键点击,并从上下文菜单中选择适当的条目。

    %#ok 语法将扩展。例如,在检查代码中的错误和警告中显示的代码中,忽略第 48 行的两条消息会在行尾添加注释 %#ok<NBRAK,NOPRT>

    即使代码分析器预设设置为启用此消息,按此方式隐藏的消息的特定实例也不会显示,这是因为 %#ok 的优先级高于预设设置。如果您以后决定要显示该行的 Terminate statement with semicolon to suppress output (in functions) 代码分析器消息,请从该行中删除 %#ok<NOPRT>

在当前文件中隐藏所有消息实例

您可以在当前文件中隐藏特定代码分析器消息的所有实例。例如,使用检查代码中的错误和警告中显示的代码,执行下列步骤:

  1. 在第 48 行,在第一个下划线处右键点击(对于单键鼠标,按 Ctrl 并点击)。

  2. 从上下文菜单中,选择取消‘使用分号终止语句...’ > 在此文件中

注释 %#ok<*NOPRT> 出现在行尾,指示 MATLAB 隐藏当前文件中 Terminate statement with semicolon to suppress output (in functions) 代码分析器消息的所有实例。此消息的所有下划线以及消息指示标记条中对应的标记都将消失。

如果某行上有两条您不希望显示在当前文件中的任何位置的消息,请在每个下划线处分别右键点击,并从上下文菜单中选择适当的条目。%#ok 语法将扩展。例如,在检查代码中的错误和警告中显示的代码中,忽略第 48 行的两条消息会添加注释 %#ok<*NBRAK,*NOPRT>

即使代码分析器预设设置为启用此消息,此消息也不会显示,这是因为 %#ok 的优先级高于预设设置。如果您以后决定要在当前文件中显示 Terminate statement with semicolon to suppress output (in functions) 代码分析器消息的所有实例,请从该行中删除 %#ok<*NOPRT>

在所有文件中隐藏所有消息实例

您可以在所有文件中禁用代码分析器消息的所有实例。例如,使用检查代码中的错误和警告中显示的代码,执行下列步骤:

  1. 在第 48 行,在第一个下划线处右键点击(对于单键鼠标,按 Ctrl 并点击)。

  2. 选择取消‘使用分号终止语句...’ > 在所有文件中

这会修改代码分析器预设设置。

如果您知道要隐藏哪一条或哪几条消息,可以直接使用代码分析器预设禁用它们,如下所示:

  1. 主页选项卡上的环境部分中,点击 预设

  2. 选择 MATLAB > 代码分析器

  3. 搜索消息以查找要隐藏的消息。

  4. 清除与您要在所有文件中隐藏的每条消息关联的复选框。

  5. 点击确定

保存并重新使用代码分析器消息设置

您可以指定您要启用或禁用某些代码分析器消息,然后将这些设置保存至文件。当您希望将设置文件用于某特定文件时,可从代码分析器预设窗格选择它。该设置文件会一直有效,直到您选择另一设置文件为止。通常,当您希望将某特定设置文件用于一部分文件时,要更改设置文件。

执行下列步骤:

  1. 主页选项卡上的环境部分中,点击 预设

    “预设项”对话框随即打开。

  2. 选择 MATLAB > 代码分析器

  3. 启用或禁用特定消息或消息类别。

  4. 点击“操作”按钮 ,选择另存为,然后将设置保存为 txt 文件。

  5. 点击确定

您可以对任何 MATLAB 文件重复使用这些设置,或向另一用户提供该设置文件。

要使用保存的设置,请执行以下操作:

  1. 主页选项卡上的环境部分中,点击 预设

    “预设项”对话框随即打开。

  2. 选择 MATLAB > 代码分析器

  3. 使用当前设置下拉列表选择浏览...

    随即显示“打开”对话框。

  4. 从任何设置文件中进行选择。

    您选择的设置对于所有 MATLAB 文件都有效,直到您选择另一组代码分析器设置为止。

了解包含隐藏消息的代码

如果您收到包含隐藏消息的代码,您可能需要查看这些消息,而无需首先取消隐藏它们。由于以下任何原因,消息可能处于隐藏状态:

  • 一个或多个 %#ok<message-ID> 指令所在的代码行引发了 <message-ID> 指定的消息。

  • 一个或多个 %#ok<*message-ID> 指令所在的文件引发了 <message-ID> 指定的消息。

  • 它在代码分析器预设窗格中被清除。

  • 它在默认情况下被禁用。

要确定某些消息被隐藏的原因,请执行以下操作:

  1. 搜索文件中的 %#ok 指令并创建与该指令关联的所有消息 ID 列表。

  2. 主页选项卡上的环境部分中,点击 预设

    “预设项”对话框随即打开。

  3. 选择 MATLAB > 代码分析器

  4. 在搜索字段中,键入 msgid: 并且后跟您在步骤 1 中找到的其中一个消息 ID(如果有)。

    消息列表现在仅包含与该 ID 对应的消息。如果该消息是超链接,点击它可查看该消息的说明和建议的操作。这可以深入了解该消息被隐藏或禁用的原因。下面的图像显示当您在搜索字段中输入 msgid:CPROP 时“预设项”对话框的显示情况。

  5. 点击 按钮以清除搜索字段,然后对您在步骤 1 中找到的每个消息 ID 重复步骤 4。

  6. 显示默认被禁用以及在“预设”窗格中被禁用的消息,方法是点击搜索字段右侧的向下箭头。然后,点击显示已禁用的消息

  7. 查看与每个消息 ID 关联的消息以了解它为何在代码中被隐藏或在“预设”中被禁用。

了解代码分析的局限

代码分析是一个非常有用的工具,但有一些局限:

  • 有时候,它无法生成您预期的代码分析器消息。

    按照设计,代码分析会尝试最大限度地减少其返回的不正确的消息数,即使此行为导致某些问题不被发现也如此。

  • 有时,它生成的消息不适用于您的情形。

    当提供消息时,点击详细信息按钮可了解详细信息,这可帮助您做出此判断。错误消息几乎总说明存在问题。但是,许多警告是一些建议,指示您查看代码中的某些异常因此可疑的内容,但在您特定的情况下可能正确。

    如果您确信某警告消息不适用于您的情形,可隐藏该消息。如果您隐藏消息的理由不明显或模糊,请包含注释加以说明。这样,阅读您的代码的用户就可以知道这种情况。

    有关详细信息,请参阅调整代码分析器消息指示标记和消息

这些节介绍了关于以下方面的代码分析限制:

区分函数名称与变量名称

代码分析无法始终将函数名称与变量名称区分开。对于以下代码,如果启用了代码分析器消息,则代码分析会返回消息 Code Analyzer cannot determine whether xyz is a variable or a function, and assumes it is a function。代码分析无法做出判断,这是因为 xyz 未向其分配明显的值。但是,程序可能已将该值放入工作区中,只是代码分析无法检测到。

function y=foo(x)
   .
   .
   .
   y = xyz(x);
end

例如,在以下代码中,xyz 可以为函数,或者可以为从 MAT 文件加载的变量。代码分析无法做出判断。

function y=foo(x)
    load abc.mat
    y = xyz(x);
end
当您使用 evalevalcevalinassignin 函数时,变量也有可能不被代码分析检测到。

如果代码分析将变量误认为是函数,请执行以下操作之一:

  • 初始化该变量,以便代码分析不将其视为函数。

  • 对于 load 函数,请在 load 命令行中显式指定变量名称。例如:

     function y=foo(x)
         load abc.mat xyz
         y = xyz(x);
     end

区分结构体与句柄对象

代码分析无法始终将结构体与句柄对象区分开。在以下代码中,如果 x 是一个结构体,您可能收到代码分析器消息,指示代码从未使用该结构体的更新值。但如果 x 是一个句柄对象,则该代码可能正确。

function foo(x)
		x.a = 3;
end

代码分析无法确定 x 是结构体还是句柄对象。为了最大限度减少不正确的消息数,代码分析对以上代码不返回任何消息,即使它可能包含细微和严重的问题也如此。

区分内置函数与重载函数

如果在类中或在路径上重载某些内置函数,则代码分析器消息可能适用于该内置函数,但不适用于您所调用的重载函数。本例中,在消息显示的行上隐藏该消息或者在整个文件隐藏它。

有关隐藏消息的信息,请参阅调整代码分析器消息指示标记和消息

确定变量的大小或形状

代码分析在确定变量的类型和矩阵的形状时的能力有限。代码分析生成的消息可能适合多数常见情况(例如向量)。但是,这些消息可能不适用于不太常见的情况(例如矩阵)。

分析具有超类的类定义

代码分析器仅提供有限的功能检查具有超类的类定义。例如,代码分析器不总能确定类是否为句柄类,但它有时能验证类中使用的自定义属性(如果这些属性是从某个超类继承的)。在分析类定义时,代码分析器会尽量使用来自超类的信息,但它往往无法获得足够的信息做出肯定的决定。

分析类方法

多数类方法都必须至少包含一个参数,该参数是与方法属于相同类的对象。但它并非必须总是第一个参数。当它是第一个参数时,代码分析可确定参数是否属于您所定义类的对象,并且是否可执行各种检查。例如,它可以检查属性和方法名称是否存在并且拼写是否正确。但是,当代码分析无法确定对象是否属于您所定义类的参数时,它无法提供这些检查。

启用 MATLAB 编译器部署消息

通过更改此消息类别的代码分析器预设项,可以在处理文件时选择显示或隐藏编译器部署消息。您的选择可能取决于您是否在处理要部署的文件。当您更改该预设时,会同时在编辑器中更改该设置。反之亦然 - 当您从编辑器中更改该设置时,也会有效更改该预设。但是,如果您在编辑器中修改该设置时该对话框处于打开状态,则您将看不到反映在“预设项”对话框中的更改。无论您是从编辑器还是从“预设项”对话框中更改该设置,它都应用于编辑器和代码分析器报告。

要启用 MATLAB Compiler™ 部署消息,请执行以下操作:

  1. 主页选项卡上的环境部分中,点击 预设

    “预设项”对话框随即打开。

  2. 选择 MATLAB > 代码分析器

  3. 点击搜索字段旁边的向下箭头,然后选择显示类别中的消息 > MATLAB Compiler (部署)信息

  4. 点击启用类别按钮。

  5. 清除不想为您的代码显示的消息(如果有)。

  6. 决定您是否要保存这些设置,以便下次您处理要部署的文件时可重复使用它们。

您可按保存并重新使用代码分析器消息设置中所述创建的设置 txt 文件包括该设置的状态。