本主题说明如何防止 C/C++test 报告选定的静态分析违规。
各节内容包括:
抑制用于防止 C/C++test 报告选定的静态分析违例事件。对于通常希望遵循规则但决定忽略所报告任务的特定情况的情况,可以使用抑制。
抑制可以存储在源代码中或本地抑制文件中,可以在源控制系统中对其进行检查,以便在团队中共享它们。您可以使用 Parasoft GUI 创建抑制或在源代码或抑制文件中手动添加有关抑制的信息。此外,可以通过配置文件以编程方式定义抑制。
如果您实施工作流程以实现对 MISRA 标准的遵从性,则可以从 DTP 上创建的 MISRA 遵从性报告中排除误报违规行为。当您抑制违规并指定以“误报”开头的抑制原因时,该违规将不会包括在 MISRA 遵从性报告中。有关 Parasoft 遵从性解决方案的详细信息,请参见 DTP 用户指南。 |
抑制显示在【质量任务】视图中的静态分析任务:
如果选择将抑制存储在文件中,它将被存储在 parasoft.suppress 文件中,该文件与包含违反规则的源文件位于同一目录中。您可以通过以下方式之一定义文件内抑制:
通过在 GUI 中选择在抑制文件中抑制 选项(请参见在 GUI 中定义抑制)。新创建的抑制文件将自动包含在您的项目中,并与其他项目文件一起显示在 IDE 的文件树中。
我们建议您在源代码控制系统中检查抑制文件。这使您可以与其他团队成员共享有关抑制的信息,并在将代码合并到主要开发流(例如 "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 的功能将抑制迁移到文件内抑制格式:
如果您的 C/C++test 安装连接到团队服务器,C/C++test 会检测并迁移存储在团队服务器上的团队抑制。因此:
如果 C/C++test 安装未连接到团队服务器,C/C++test 会检测并迁移存储在您的工作空间中的本地抑制。因此:
如果您想从备份文件中恢复已弃用的本地抑制:
转到存储备份文件的位置(该位置已打印到控制台)。它包括 local_suppressions_backup.zip 文件。
将 local_suppressions_backup.zip 的内容提取到同一位置。
您可以在下次 IDE 启动时重新迁移恢复的本地抑制。
启用弃止的抑制功能可以使您以弃止格式创建抑制并将其存储在本地或团队服务器上。