使用代码分析器检查代码中的错误和警告
MATLAB® 代码分析器可自动检查您的代码有无编码问题。您可以查看有关您代码的警告和错误消息,并基于这些消息修改您的文件。这些消息会自动持续更新,因此您可以看到您的更改是否解决了消息中指明的问题。某些消息提供其他信息和/或自动代码更正。
启用持续代码检查
要启用持续代码检查,请在主页选项卡上的环境部分中,点击 预设。选择 MATLAB > 代码分析器,然后选中启用集成警告和错误消息复选框。将下划线选项设置为“
为警告和错误添加下划线
”。
启用持续代码检查后,MATLAB 会在编辑器和实时编辑器中显示有关代码的警告和错误消息。例如,示例文件 lengthofline.m
包含几个错误和警告。将该文件复制到您的当前文件夹中,然后在编辑器中打开它。
copyfile(fullfile(matlabroot,'help','techdoc','matlab_env','examples','lengthofline.m')) fileattrib('lengthofline.m','+w'); edit('lengthofline.m')
查看文件的代码分析器状态
当您在编辑器或实时编辑器中打开文件时,指示标记条顶部的消息指示标记会显示该文件的整体代码分析器状态。
消息指示标记 | 说明 |
---|---|
![]() | 文件包含语法错误或其他重大问题。 |
![]() | 文件包含警告或改进机会,但没有错误。 |
![]() | 文件不含错误或警告,不需要改进。 |
例如,在 lengthofline.m
中,消息指示标记是 ,这意味着文件包含至少一个错误。
查看代码分析器消息
要转到包含消息的第一个代码片段,请点击消息指示标记。标识的代码片段以红色(表示错误)或橙色(表示警告和改进机会)下划线标出。如果文件包含错误,点击消息指示标记会转至第一个错误。
例如,在 lengthofline.m
中,当您点击消息指示标记时,光标移至第 47 行,第一个错误发生在该行。MATLAB 在指示标记条中的错误标记旁边显示该行的错误。多条消息可能代表存在一个问题或多个问题。解决一条消息可能会同时解决所有消息。或者,在解决一条消息后其他消息可能有变化,或者您需要采取的操作可能变得更清晰。
要转到包含消息的下一代码片段,请点击消息指示标记。您也可以点击指示标记条中的某个标记,以转至该标记所代表的行。例如,点击 lengthofline.m
中指示标记条中的第一个标记。光标移至第 21 行的开头。
要查看代码片段的消息,请在带下划线的代码片段内移动鼠标指针。您也可以将光标放在带下划线的代码片段中,然后按 Ctrl+M。如果该消息还有附加信息,则会包括一个详细信息按钮。点击该按钮可显示附加信息和任何建议的用户操作。
修复代码中的问题
对于代码文件中的每条消息,请修改代码以解决消息中指明的问题。当您修改代码时,消息指示标记和下划线会更新以反映您所做的更改,即使您没有保存文件也是如此。
例如,在 lengthofline.m
的第 47 行,该消息提示存在分隔符不平衡问题。当您在每个分隔符上移动箭头键时,MATLAB 并未指示存在不匹配。但是,代码分析检测到 data{3}(;)
中有分号,并将其解释为语句结束符。
要解决此问题,请在第 47 行中将 data{3}(;)
更改为 data{3}(:)
。只需一次更改就解决了第 47 行的所有消息,该行不再显示下划线。因为通过更改移除了文件中的唯一错误,所以栏顶部的消息指示标记从 变为
,指示只存在警告和潜在改进机会。
对于某些消息,MATLAB 建议您应用自动修复来解决问题。如果某个问题有可用的自动修复,代码片段会突出显示,并且消息中包含修复按钮。
例如,在 lengthofline.m
中的第 27 行,将鼠标放在带下划线并突出显示的代码片段 prod
上。显示的消息包括修复按钮。
如果您知道如何解决问题(也许是根据以前的经验),可以点击修复按钮。如果您不熟悉该问题,可以右键点击突出显示的代码。上下文菜单中的第一个项目显示了建议的修复。选择要应用修复的项目。
如果某个问题存在多个实例,则 MATLAB 可能会提议为该问题的所有实例应用建议的修复。要对问题的所有实例应用修复,可以右键点击突出显示的代码,然后选择修复此问题的所有(n
个)实例。此选项并非对所有建议的修复都可用。
在修改代码以解决所有消息中的问题或禁用指定的消息后,消息指示标记变为绿色。所有消息均得到解决的示例文件已另存为 lengthofline2.m
。例如,要打开示例文件 lengthofline.m
的更正后的版本,请使用以下命令:
open(fullfile(matlabroot,'help','techdoc',... 'matlab_env', 'examples','lengthofline2.m'))
创建代码分析器消息报告
您可以为一个文件夹中的所有文件创建代码分析器消息报告。
要为文件夹中的所有文件创建报告,请执行下列步骤:
在当前文件夹浏览器中,点击
按钮。
选择报告 > 代码分析器报告。
基于报告中的消息修改您的文件。
保存修改的文件。
重新运行该报告,以查看您的更改是否解决了消息中指明的问题。
要为单个 MATLAB 代码文件创建报告,请使用 mlintrpt
函数。例如,要为示例文件 lengthofline.m
创建报告,请在命令行窗口中输入 mlintrpt('lengthofline.m')
。
有关详细信息,请参阅 MATLAB 代码分析器报告。
调整代码分析器消息指示标记和消息
您可以指定为哪种类型的编码问题加上下划线,以契合您当前开发阶段的需求。例如,首次编码时,您可能希望只对错误使用下划线,这是因为警告会带来纷扰。要更改下划线预设项,请在主页选项卡的环境部分中,点击 预设。选择 MATLAB > 代码分析器,然后选择下划线选项。
您还可以调整在分析代码时看到的消息。代码分析并不能提供关于每种情况的完美信息。有时,您可能不想根据消息更改代码。如果您不想更改代码,并且不希望看到特定行的标记和消息,可隐藏它们。例如,示例文件 lengthofline.m
的第 48 行的第一条消息是用分号终止语句以隐藏输出(在函数中)
。在语句末尾添加分号隐藏输出,这是一种常见做法。针对生成输出但缺少终止分号的行,代码分析可向您发出警报。如果您想查看第 48 行后的输出,请不要按消息指示添加分号。
您可以通过以下方式隐藏(关闭)警告和错误消息的指示标记:
在当前文件中隐藏消息实例。
在当前文件中隐藏所有消息实例。
在所有文件中隐藏所有消息实例。
您不能隐藏诸如语法错误之类的错误消息。
在当前文件中隐藏消息实例
您可以在当前文件中隐藏代码分析器消息的特定实例。例如,要隐藏示例文件 lengthofline.m
中第 48 行的消息,请右键点击第 48 行的第一条下划线,然后选择隐藏‘使用分号终止语句...’ > 在此行中。
注释 %#ok<NOPRT>
出现在行尾,指示 MATLAB 对该行隐藏用分号终止语句以隐藏输出(在函数中)
代码分析器消息。该消息的下划线和指示标记条中对应的标记随即消失。
如果一行中包含两条您不想显示的消息,请分别右键点击每条下划线,然后从上下文菜单中选择适当的条目。%#ok
语法将扩展。例如,隐藏示例文件 lengthofline.m
中第 48 行的两条消息会在行尾添加注释 %#ok<NBRAK,NOPRT>
。
即使代码分析器预设设置为启用此消息,隐藏的消息的特定实例也不会显示,这是因为 %#ok
的优先级高于预设设置。如果您以后决定要为该行显示用分号终止语句以隐藏输出(在函数中)
代码分析器消息,请从该行中删除 %#ok<NOPRT>
。
在当前文件中隐藏所有消息实例
您可以在当前文件中隐藏特定代码分析器消息的所有实例。例如,要隐藏示例文件 lengthofline.m
中第 48 行的消息的所有实例,请右键点击第 48 行的第一条下划线,然后选择取消‘使用分号终止语句...’ > 在此文件中。
注释 %#ok<*NOPRT>
出现在行尾,指示 MATLAB 隐藏当前文件中用分号终止语句以隐藏输出(在函数中)
代码分析器消息的所有实例。此消息的所有下划线以及消息指示标记条中对应的标记都将消失。
如果一行中包含两条您不想在当前文件中显示的消息,请分别右键点击每条下划线,然后从上下文菜单中选择适当的条目。%#ok
语法将扩展。例如,隐藏示例文件 lengthofline.m
中第 48 行的两条消息会添加注释 %#ok<*NBRAK,*NOPRT>
。
即使代码分析器预设设置为启用此消息,此消息也不会显示,这是因为 %#ok
的优先级高于预设设置。如果您以后决定要在当前文件中显示用分号终止语句以隐藏输出(在函数中)
代码分析器消息的所有实例,请从该行中删除 %#ok<*NOPRT>
。
在所有文件中隐藏所有消息实例
您可以在所有文件中禁用代码分析器消息的所有实例。例如,要隐藏示例文件 lengthofline.m
中第 48 行的消息在所有文件中的所有实例,请右键点击第 48 行的第一条下划线,然后选择隐藏‘使用分号终止语句...’ > 在所有文件中。此选项会修改代码分析器预设项。
如果您知道要隐藏哪些条消息,可以直接使用代码分析器预设禁用它们:
在主页选项卡上的环境部分中,点击
预设。
选择 MATLAB > 代码分析器。
搜索消息以查找要隐藏的消息。
清除与您要在所有文件中隐藏的每条消息关联的复选框。
点击确定。
保存并重新使用代码分析器消息设置
您可以设置选项来启用或禁用特定代码分析器消息,然后将这些设置保存到文件中。当您希望将设置文件用于某特定文件时,可从代码分析器预设选择它。这些设置文件会一直有效,直到您选择另一设置文件为止。通常,当您希望将某特定设置文件用于一部分文件时,要更改设置文件。
要将设置保存到文件中,请执行下列步骤:
在主页选项卡上的环境部分中,点击
预设。
选择 MATLAB > 代码分析器。
启用或禁用特定消息或消息类别。
点击“操作”按钮
,选择另存为,然后将设置保存为
txt
文件。点击确定。
您可以对任何 MATLAB 文件重复使用这些设置,或向另一用户提供该设置文件。要使用保存的设置,请执行以下操作:
在主页选项卡上的环境部分中,点击
预设。
选择 MATLAB > 代码分析器。
打开当前设置列表,选择浏览。
从任何设置文件中进行选择。
您选择的设置对于所有 MATLAB 文件都保持有效,直到您选择另一组代码分析器设置为止。
了解包含隐藏消息的代码
如果您收到包含隐藏消息的代码,您可能需要查看消息,而不必首先取消隐藏它们。由于以下任何原因,消息可能处于隐藏状态:
一个或多个
%#ok<message-ID>
指令所在的代码行引发了<message-ID>
指定的消息。一个或多个
%#ok<*message-ID>
指令所在的文件引发了<message-ID>
指定的消息。消息在代码分析器预设窗格中被清除。
默认情况下,消息被禁用。
要确定消息隐藏的原因,请执行下列步骤:
搜索文件中的
%#ok
指令并创建与该指令关联的所有消息 ID 列表。在主页选项卡上的环境部分中,点击
预设。
选择 MATLAB > 代码分析器。
在搜索字段中,键入
msgid:
后跟步骤 1 中的消息 ID 之一。消息列表现在仅包含与该 ID 对应的消息。如果该消息是超链接,点击它可查看该消息的说明和建议的操作。这些结果可以深入了解该消息被隐藏或禁用的原因。点击“清除搜索”按钮
以清除搜索字段,然后对步骤 1 中的每个消息 ID 重复步骤 4。
要显示默认被禁用以及在预设项窗口中被禁用的消息,请点击搜索字段右侧的向下箭头。然后,选择显示已禁用的消息。
查看与每个消息 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
eval
、evalc
、evalin
或 assignin
函数时,变量也有可能不被代码分析检测到。如果代码分析将变量误认为是函数,请执行以下操作之一:
初始化该变量,以便代码分析不将其视为函数。
对于
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 编译器部署消息。您的选择可能取决于您是否在处理要部署的文件。更改此预设项会同时在编辑器中更改该设置。同样,在编辑器中更改该设置也会更改此预设项。但是,如果在编辑器中修改设置时代码分析器预设项是打开的,则更改不会反映在预设项窗口中。无论您在编辑器还是预设项窗口中更改设置,更改都会应用于编辑器和代码分析器报告。
要启用 MATLAB Compiler™ 部署消息,请执行以下操作:
在主页选项卡上的环境部分中,点击
预设。
选择 MATLAB > 代码分析器。
点击搜索字段旁边的向下箭头,然后选择显示类别中的消息 > MATLAB Compiler (部署)信息。
点击 MATLAB Compiler (部署)消息类别标题右侧的启用类别按钮。
清除不想为您的代码显示的消息。
决定您是否要保存这些设置,以便下次您处理要部署的文件时可重复使用它们。
您可按保存并重新使用代码分析器消息设置中所述创建的设置 txt
文件包括该设置的状态。