本主题说明如何防止 C/C++test 报告选定的静态分析违规。
各节内容包括:
关于抑制
抑制用于防止 C/C++test 报告选定的静态分析违例事件。对于通常希望遵循规则但决定忽略所报告任务的特定情况的情况,可以使用抑制。
抑制可以存储在源代码中或本地抑制文件中,可以在源控制系统中对其进行检查,以便在团队中共享它们。您可以使用 Parasoft GUI 创建抑制或在源代码或抑制文件中手动添加有关抑制的信息。此外,可以通过配置文件以编程方式定义抑制。
在 GUI 中定义抑制
抑制显示在【质量任务】视图中的静态分析任务:
- 右键单击代表要抑制的任务的【质量任务】视图项,然后选择抑制任务... 。
要抑制多个任务,请右键单击代表一组任务的节点(规则类别,指定规则,文件),然后选择抑制所有任务 。 - 选择抑制的存储位置。您可以选择以下选项之一:
- 在抑制文件中抑制 - 抑制将存储在与相应源文件位于同一目录中的 a parasoft.suppress 文件中。有关详细信息,请参见 在抑制文件中定义抑制 。
- 源代码中的抑制 - 在源码控制系统中选中时,所选任务将在代码中被抑制并在团队中共享。
- 本地抑制(不建议使用) - 抑制将存储在本地不推荐使用的 XML 样式格式。有关详细信息,请参见Using the Deprecated Suppression Format 。 - 输入抑制原因。
- 单击确定以完成抑制。被抑制的任务将从【质量任务】视图中删除。
在抑制文件中定义抑制
如果选择将抑制存储在文件中,它将被存储在 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
示例
至少,您必须指定检测到问题的源文件。这将抑制报告针对指定文件的所有发现。在下面的例子中,在帐户 文件中检测到的所有结果将被抑制:
suppression-begin file: Account.cpp suppression-end
其他属性是可选的,可帮助您微调抑制。在以下示例中,将忽略在帐户 文件中检测到的 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 的功能将抑制迁移到文件内抑制格式:
- 从 IDE 菜单中选择 Parasoft > 显示视图 > 抑制(弃止的)以打开弃止的抑制视图。
- 从菜单中选择迁移抑制... 。
- 按照打开的对话框中显示的说明进行操作。
如果您的 C/C++test 安装连接到团队服务器,C/C++test 会检测并迁移存储在团队服务器上的团队抑制。因此:
- 已弃用的团队抑制将转换为纯文本并保存在与相应源文件位于同一位置的 parasoft.suppress 文件中。
- 迁移后,已弃用的团队抑制在团队服务器和已弃用的抑制视图上仍然可用,需要手动删除。
如果 C/C++test 安装未连接到团队服务器,C/C++test 会检测并迁移存储在您的工作空间中的本地抑制。因此:
- 已弃用的本地抑制将转换为纯文本并保存在与相应源文件位于同一位置的 parasoft.suppress 文件中。
- 将创建一个包含已弃用格式的本地抑制的备份文件。文件的位置将打印到控制台。
- 迁移后,已弃用的本地抑制将从工作空间和已弃用的抑制视图中删除。
如果您想从备份文件中恢复已弃用的本地抑制:
- 关闭您的 IDE。
转到存储备份文件的位置(该位置已打印到控制台)。它包括 local_suppressions_backup.zip 文件。
将 local_suppressions_backup.zip 的内容提取到同一位置。
您可以在下次 IDE 启动时重新迁移恢复的本地抑制。
启用弃止的抑制
启用弃止的抑制功能可以使您以弃止格式创建抑制并将其存储在本地或团队服务器上。
- 从 IDE 菜单中选择 Parasoft > 显示视图 > 抑制(弃止的)以打开弃止的抑制视图。
- 在菜单中启用 启用弃止的抑制 选项。