本主题说明如何防止 C/C++test 报告特定的静态分析违规。
章节目录:
关于抑制
抑制用于防止 C/C++test 报告特定的静态分析违规事件。当您希望大体上遵循某个规则但忽略报告特定的任务时就可以使用抑制。
抑制可以存储在源代码或本地抑制文件中,这些文件可以签入源码控制系统,以便在整个团队中共享。您可以使用 Parasoft GUI 创建抑制,或者在源代码或抑制文件中手动添加有关抑制的信息。此外,抑制可以通过配置文件以编程方式定义。
在 GUI 中定义抑制
若要抑制质量任务视图中显示的静态分析任务:
- 右键点击要抑制的任务在质量任务视图中的对应项,然后从菜单选择抑制任务...。
若要禁止多个任务,则右键点击表示一组任务(规则分类、特定规则、文件)的节点,然后选择抑制所有任务 - 选择抑制的存储位置。您可以选择以下选项之一:
- 抑制文件中的抑制- 抑制将存储在与相应源文件位于同一目录下的 parasoft.suppress 文件中。详细信息请参阅在抑制文件中定义抑制。
-源代码中的抑制- 所选任务将在代码中抑制,并在签入源码控制系统中后与团队共享。 - 输入抑制的原因。
- 点击确定完成抑制。被抑制的任务将从质量任务视图中删除。
在抑制文件中定义抑制
如果您选择将抑制存储在文件中,抑制将存储在与包含规则冲突的源文件位于同一目录下的 parasoft.suppress 文件中。您可以通过以下方式之一定义文件中的抑制:
- 通过手动创建可以添加抑制条目的 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
示例:
您至少需要指定检测到问题的源文件。这将抑制针对指定文件报告的所有任务。在下面的示例中,在 Account 文件中检测到的所有任务都会被抑制:
suppression-begin file: Account.cpp suppression-end
其他属性是可选的,可以帮助您调整抑制。在下面的示例中,PB.TYPO.TLS 规则在 Account 文件中检测到的所有任务都被抑制,无论这些任务出现在哪个代码行:
suppression-begin file: Account.cpp rule-id: PB.TYPO.TLS reason: false positive suppression-end
属性注意事项
- 阐明抑制原因是十分明智的做法。
- 应谨慎使用
line
属性,因为如果在修改源文件时将代码移至另一行,可能会使抑制失效。 - 在
message
属性中,支持以下通配符:- ? - 任意字符
- * - 任意字符序列
在源代码中定义抑制
在源代码中定义抑制时:
- 确保您或团队成员测试该代码时应用的是相同的抑制。
- 可以添加代码注释来解释每个抑制,这样当您或团队成员审查代码时,每个抑制都有清晰的原因说明。
- 可以精确控制在文件、类或行级别强制执行哪些规则。
您可以通过 GUI(请参阅在 GUI 中定义抑制)或在源代码中手动操作在源代码中定义抑制 - 使用以下抑制语法。
行抑制
行抑制允许抑制单行中的违规。必须在出现违规的代码行末尾添加抑制注释,使用以下语法:
// parasoft-suppress <rule-id>|<rule-category>|ALL "<suppression comment>"
示例:
int proc1(bool a, bool b, int i) { if (a | b) // parasoft-suppress CERT_C "suppress all rules in category CERT_C" if (b = a)// parasoft-suppress CERT_C-EXP45 "suppress rule CERT_C-EXP45" { std::string emptyString1 = ""; // parasoft-suppress JSF-3 "suppress all rules in category Joint Strike Fighter with severity level 3" } else { std::string emptyString2 = ""; // parasoft-suppress CERT_C-DCL00 JSF-043 JSF-051 "suppress multiple rules" } return i++; // parasoft-suppress ALL "suppress all rules" }
下一行抑制
下一行抑制允许抑制单行中的违规。必须在出现违规的代码行之前提那家抑制注释,使用以下语法:
// parasoft-suppress-next-line <rule-id>|<rule-category>|ALL "<suppression comment>"
抑制注释和包含被抑制任务的行之间不允许有其他注释或空行。唯一的例外是指定了下一行抑制列表的情况:
// parasoft-suppress-next-line AUTOSAR-A7_1_1-a "reason for suppression AUTOSAR-A7_1_1-a" // parasoft-suppress-next-line AUTOSAR-A7_1_1-b "reason for suppression AUTOSAR-A7_1_1-b" // parasoft-suppress-next-line AUTOSAR-A8_5_2-a "reason for suppression AUTOSAR-A8_5_2-a" ... code line ...
在这种情况下,所有抑制都将应用于最后一个抑制注释之后的第一行。
示例:
int proc1(bool a, bool b, int i) { // parasoft-suppress-next-line CERT_C "suppress all rules in category CERT_C" if (a | b) // parasoft-suppress-next-line CERT_C-EXP45 "suppress rule CERT_C-EXP45" if (b = a) { // parasoft-suppress-next-line JSF-3 "suppress all rules in category Joint Strike Fighter with severity level 3" std::string emptyString1 = ""; } // parasoft-suppress-next-line ALL "suppress all rules" return i++; }
代码块抑制
代码块抑制允许抑制代码块中的违规。必须在出现违规的代码块前/后指定抑制开始/结束注释,使用以下语法:
// parasoft-begin-suppress <rule-id>|<rule-category>|ALL "<suppression comment>" ... code block ... // parasoft-end-suppress <rule-id>|<rule-category>|ALL "<suppression comment>"
示例:
int proc2(bool a, bool b, int i) { // parasoft-begin-suppress CERT_C "begin suppress all rules in category CERT_C" if (a | b) if(b = a) // parasoft-end-suppress CERT_C "end suppress all rules in category CERT_C" { std::string emptyString1 = ""; } return i++; } int proc3(bool a, bool b, int i) { if (a | b) // parasoft-begin-suppress CERT_C-EXP45 "begin suppress rule CERT_C-EXP45" if(b = a) // parasoft-end-suppress CERT_C-EXP45 "end suppress rule CERT_C-EXP45" { std::string emptyString1 = ""; } return i++; } int proc4(bool a, bool b, int i) { // parasoft-begin-suppress JSF-3 "begin suppress all rules in category Joint Strike Fighter with severity level 3" if (a | b) if(b = a) { std::string emptyString1 = ""; } return i++; // parasoft-end-suppress JSF-3 "end suppress all rules in category Joint Strike Fighter with severity level 3" } // parasoft-begin-suppress ALL "begin suppress all rules" int proc5(bool a, bool b, int i) { if (a | b) if(b = a) { std::string emptyString1 = ""; } return i++; } // parasoft-end-suppress ALL "end suppress all rules"
要在文件中抑制多个规则,应在文件的开头/结尾包含以下内容:
// parasoft-begin-suppress CERT_C-DCL00 JSF-043 JSF-051 "begin suppress multiple rules" ..... // parasoft-end-suppress CERT_C-DCL00 JSF-043 JSF-051 "end suppress multiple rules"
基于正则表达式模式定义行抑制
您可以将 C/C++test 配置为自动抑制在匹配正则表达式模式的行中检测到的静态规则违规。这对于想要抑制行内或文件内抑制难以抑制的任务(例如,Qt 宏)时十分有效。
定义正则表达式模式以指定代码行的步骤:
创建一个高级设置文件,包含项以下 C/C++test 的高级设置:
cpptest.result.line.suppressions.enabled=true // Enables creating regex-based suppressions. cpptest.result.line.suppressions.pattern=[regex<rule-id|rule-category|ALL>;regex<rule-id|rule-category|ALL>] // Specifies a semicolon-separated list of regex patterns.
注意:仅当指定规则时才需要 <> 括号。规则修饰符也可以是逗号分隔的列表。
- 指定高级设置的路径。请参阅配置高级设置文件。
在匹配配置的正则表达式模式的行中出现的静态规则违规将被抑制。例如,以下配置将抑制在代码行中任何位置包含“Q_”的所有任务。
cpptest.result.line.suppressions.enabled=true cpptest.result.line.suppressions.pattern=.*Q_.*<OPT>
处理已弃用的抑制
不再支持以 XML 样式格式存储抑制。如果项目中有您想要使用新格式迁移的不受支持的抑制,请联系 Parasoft 支持。