本主题说明如何防止 C/C++test 报告选定的静态分析违规。
内容包括:
关于抑制
抑制用于防止 C/C++test 报告选定的静态分析违例事件。对于通常希望遵循规则但决定忽略所报告任务的特定情况的情况,可以使用抑制。
抑制可以存储在源代码中或本地抑制文件中,可以在源控制系统中对其进行检查,以便在团队中共享它们。您可以使用 Parasoft GUI 创建抑制或在源代码或抑制文件中手动添加有关禁止的信息。此外,可以通过配置文件以编程方式定义抑制。
在 GUI 中定义抑制
抑制【质量任务】视图中显示的静态分析任务:
- 右键单击代表要抑制的任务的【质量任务】视图项,然后选择抑制任务... 。
要抑制多个任务,请右键单击代表一组任务的节点(规则类别、指定规则、文件),然后选择抑制所有任务 - 选择抑制的存储位置。您可以选择以下选项之一:
- 在抑制文件中抑制 - 抑制将存储在与相应源文件位于同一目录中的 一个 parasoft.suppress 文件中。有关详细信息,请参见 在抑制文件中定义抑制 。
- 源代码中的抑制 - 在源代码管理系统中检入时,所选任务将在代码中被抑制并在团队中共享。
- 本地抑制 (不建议使用) - 抑制将存储在本地不推荐使用的 XML 样式格式。有关详细信息,请参见 使用已弃用的抑制格式 。 - 输入抑制原因。
- 单击确定以完成抑制。 被抑制的任务将从【质量任务】视图中删除。
在抑制文件中定义抑制
如果选择将抑制存储在文件中,它将被存储在 parasoft.suppress文件中,该文件与包含违反规则的源文件位于同一目录中。您可以通过以下方式之一定义文件内抑制:
- 通过手动创建 parasoft.suppress 文件,可以在其中添加抑制条目。如果您手动创建抑制文件,请确保该文件与包含要抑制任务的源文件位于同一目录中。
通过在 GUI 中选择 在抑制文件中抑制 选项 (请参见在 GUI 中定义抑制).
新创建的抑制文件不包括在您的项目中。要添加抑制文件到您的项目中:
- 启用 Visual Studio 解决方案资源管理器工具栏上的显示所有文件选项,如果已启用该选项,则刷新解决方案资源管理器。 这将显示项目外部的文件,包括 Parasoft 抑制文件。
- 右键单击添加到项目的抑制文件,然后从菜单中选择包含在项目中。
我们建议您在源代码控制系统中检查抑制文件。这使您可以与其他团队成员共享有关抑制的信息,并在将代码合并到主要开发流(例如 "master","trunk'等)中之前轻松查看 SCM 存储库中分支上的抑制。
使用以下格式将抑制条目添加到 parasoft.suppress 文件中:
suppression-begin file: Account.cpp (required) line: 12 (optional) rule-id: CODSTA-123 (optional) message: Exact violation message (optional) reason: Approved (optional) author: devel (optional) date: 2020-09-21 (optional) suppression-end
示例
至少,您必须指定检测到问题的源文件。这将抑制报告针对指定文件的所有发现。在下面的例子中,在 Account 文件中检测到的所有结果将被抑制:
suppression-begin file: Account.cpp suppression-end
其他属性是可选的,可帮助您微调抑制。在以下示例中,将忽略在 Account 文件中检测到的 PB.TYPO.TLS 规则的所有发现,无论它们出现在哪条代码行上:
suppression-begin file: Account.cpp rule-id: PB.TYPO.TLS reason: false positive suppression-end
属性说明
- 指定抑制的原因是很好的做法。
- 应谨慎使用 line 属性,因为如果在修改源文件时将代码移动到另一行,它可能会使抑制无效。
在源代码中定义抑制
在源代码中定义抑制时:
- 您确保在您或团队成员测试该代码时应用相同的抑制。
- 您可以添加解释每个抑制的代码注释,因此当您或团队成员查看代码时,每次抑制的原因总是很清楚。
- 您可以获得对在文件、类或行级别强制执行哪些规则的细粒度控制。
您可以通过在 GUI 中选择适当的选项 (请参阅在 GUI 中定义抑制) 或在源代码中手动定义抑制 – 使用以下抑制语法。
行抑制
<suppression keyword> [<rule category> | <rule category> . <rule id> | <rule category > - <rule severity> | ALL ] <suppression comment>
行抑制示例
//parasoft-suppress CODSTA "suppress all rules in category CODSTA" // parasoft-suppress CODSTA.NEA "suppress rule CODSTA.NEA" // parasoft-suppress CODSTA-1 "suppress all rules in category CODSTA with severity level 1" // parasoft-suppress ALL "suppress all rules" // parasoft-suppress CODSTA FORMAT.MCH JAVADOC-3 "suppress all rules in category CODSTA and rule FORMAT.MCH and all rules in category JAVADOC with severity level 3"
块抑制
<begin suppression keyword> [<rule category> | <rule category> . <rule id> | <rule category > - <rule severity> | ALL ] <suppression comment> ..... source code block ..... <end suppression keyword> [<rule category> | <rule category> . <rule id> | <rule category > - <rule severity> | ALL ] <suppression comment>
块抑制示例
// parasoft-begin-suppress CODSTA "begin suppress all rules in category CODSTA" ..... // parasoft-end-suppress CODSTA "end suppress all rules in category CODSTA" // parasoft-begin-suppress CODSTA.NEA "begin suppress rule CODSTA.NEA" ..... // parasoft-end-suppress CODSTA.NEA "end suppress rule CODSTA.NEA" // parasoft-begin-suppress CODSTA-1 "begin suppress all rules in category CODSTA with severity level 1" ...... // parasoft-end-suppress CODSTA-1 "end suppress all rules in category CODSTA with severity level 1" //parasoft-begin-suppress ALL "begin suppress all rules" ..... // parasoft-end-suppress ALL "end suppress all rules" // parasoft-begin-suppress CODSTA FORMAT.MCH "begin suppress all rules in category CODSTA and rule FORMAT.MCH" ..... // parasoft-end-suppress CODSTA FORMAT.MCH "end suppress all rules in category CODSTA and rule FORMAT.MCH" // parasoft-begin-suppress CODSTA "begin suppress all rules in category CODSTA" ..... // parasoft-end-suppress CODSTA-1 "end suppress all rules in category CODSTA with severity level 1; however rules with severity level 2-5 in category CODSTA are still suppressed." ..... // parasoft-end-suppress CODSTA "end suppress all rules in category CODSTA" // parasoft-begin-suppress ALL "begin suppress all rules" ..... // parasoft-end-suppress CODSTA FORMAT-1 "end suppress all rules in category CODSTA and all rules in category FORMAT with severity level 1; however, others rules in CODSTA and FORMAT-1 are still suppressed." ..... // parasoft-end-suppress ALL "end suppress all rules" //parasoft-begin-suppress ALL "begin suppress all rules, since no end suppression comment, all rules will be suppressed starting from this line"
基于正则表达式模式定义行抑制
您可以配置 C/C++test 来自动抑制在与正则表达式模式匹配的行上检测到的静态规则违规。当您想抑制难以使用行内或代码内抑制来抑制的任务(例如 Qt macros)时,这可能很有用。
要定义正则表达式模式以指定代码行:
创建一个高级设置文件,其中包含以下 C/C++test 的高级设置:
cpptest.result.line.suppressions.enabled=true // Enables creating regex-based suppressions. cpptest.result.line.suppressions.pattern=[regex;regex] // Specifies a semicolon-separated list of regex patterns.
- 指定高级设置的路径。请参见 配置高级设置文件。
在与配置的正则表达式模式匹配的行上发生的静态规则违规将被抑制。例如,以下配置将抑制在代码行上任何位置包含 "Q_” 的代码行上检测到的所有结果。
cpptest.result.line.suppressions.enabled=true cpptest.result.line.suppressions.pattern=.*Q_.*
处理弃止的抑制
不建议在本地或团队服务器上以 XML-style 格式存储抑制。从 C/C++test 2020.2 开始,直接以代码或新的文件内格式创建抑制 (请参见 在抑制文件中定义抑制)。如果您的项目可以使用弃止的格式的抑制(通常,将 C/C++test 升级到 2020.2 或更高版本,并且使用以前的 C/C++test 版本创建了抑制),它们仍然会应用于您的代码,然后可以在弃止的【抑制】视图中对其进行查看。
迁移弃止的抑制
您可以使用 C/C++test 的功能将本地抑制迁移为新格式。如果您需要迁移存储在团队服务器上的抑制,请联系 Parasoft 支持。
迁移弃止的本地抑制:
- 从 IDE 菜单中选择 Parasoft > 显示视图 > 抑制(弃止的) 以打开弃止的抑制视图。
- 从菜单中选择迁移抑制... 。
- 按照打开的对话框中显示的说明进行操作。
迁移具有以下结果:
- 弃止的格式的抑制将转换为纯文本,并保存在与相应源文件位于相同位置的 parasoft.suppress 文件中。
- 将创建一个备份文件,其中包含弃止的格式。文件的位置将打印到控制台。
- 将从工作空间和弃止的【抑制】视图中删除弃止格式的抑制。
如果您想从备份文件中恢复已弃止的抑制执行以下步骤:
- 关闭您的 IDE。
转到存储备份文件的位置(该位置已打印到控制台)。它包括 local_suppressions_backup.zip 文件。
将 local_suppressions_backup.zip 的内容提取到同一位置。
您可以在下次 IDE 启动时重新迁移恢复的抑制。
启用弃止的抑制
启用弃止的抑制功能可以使您以弃止格式创建抑制并将其存储在本地或团队服务器上。
- 从 IDE 菜单中选择 Parasoft > 显示视图> 抑制(弃止的) 以打开弃止的抑制视图。
- 在菜单中启用 用弃止的抑制 选项。