本主题说明如何在源代码或抑制文件中手动抑制 Parasoft·任务。有关使用 IDE 的 UI 抑制任务的信息,请参阅在 GUI 中抑制任务。
简介
通过抑制定义,可以阻止 Jtest 报告特定的静态分析任务。如果希望大体上遵循某个规则,但需要忽略特定的任务,就可以使用抑制。如果不希望收到某个特定规则的违规任务,则可以在测试配置中禁用该规则。
在源代码中定义抑制
可以使用以下指定语法在源代码中定义抑制。
行抑制
行抑制允许抑制单行中的违规。必须在出现违规的代码行末尾添加抑制注释,使用以下语法:
// parasoft-suppress <rule-id>|<rule-category>|ALL "<suppression comment>"
示例:
int proc1(boolean a, boolean b, int i) { if (a | b) // parasoft-suppress CWE "suppress all rules in category CWE" if (b = a) // parasoft-suppress PB.TYPO.ASI "suppress rule PB.TYPO.ASI" { String emptyString1 = ""; // parasoft-suppress CWE-3 "suppress all rules in category CWE with severity level 3 // and lower" } else { String emptyString2 = ""; // parasoft-suppress SECURITY.WSC.SL BD.PB.VOVR CWE.563.VOVR "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 CODSTA.NEA "reason for suppression CODSTA.NEA" // parasoft-suppress-next-line FORMAT.MCH "reason for suppression FORMAT.MCH" // parasoft-suppress-next-line JAVADOC "reason for suppression JAVADOC " ... code line ...
示例:
int proc1(boolean a, boolean b, int i) { // parasoft-suppress-next-line CWE "suppress all rules in category CWE" if (a | b) // parasoft-suppress-next-line PB.TYPO.ASI "suppress rule PB.TYPO.ASI" if (b = a) { // parasoft-suppress-next-line CWE-3 "suppress all rules in category CWE with severity level 3 and lower" 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>"
‘parasoft-begin-suppress’和‘parasoft-end-suppress’注释必须写在单独的行中。
示例:
int proc2(boolean a, boolean b, int i) { // parasoft-begin-suppress CWE "begin suppress all rules in category CWE" if (a | b) if(b = a) // parasoft-end-suppress CWE "end suppress all rules in category CWE" { String emptyString = ""; } return i++; } int proc3(boolean a, boolean b, int i) { if (a | b) // parasoft-begin-suppress PB.TYPO.ASI "begin suppress rule PB.TYPO.ASI" if(b = a) // parasoft-end-suppress PB.TYPO.ASI "end suppress rule PB.TYPO.ASI" { String emptyString = ""; } return i++; } int proc4(boolean a, boolean b, int i) { // parasoft-begin-suppress CWE-3 "begin suppress all rules in category CWE with severity level 3 and lower" if (a | b) if(b = a) { String emptyString = ""; } return i++; // parasoft-end-suppress CWE-3 "end suppress all rules in category CWE with severity level 3 and lower" } // parasoft-begin-suppress ALL "begin suppress all rules" int proc5(boolean a, boolean b, int i) { if (a | b) if(b = a) { String emptyString = ""; } return i++; } // parasoft-end-suppress ALL "end suppress all rules"
要在文件中抑制多个规则,应在文件的开头/结尾包含以下内容:
// parasoft-begin-suppress SECURITY.WSC.SL BD.PB.VOVR CWE.563.VOVR "begin suppress multiple rules" ..... // parasoft-end-suppress SECURITY.WSC.SL BD.PB.VOVR CWE.563.VOVR "end suppress multiple rules"
注意
- 建议阐明抑制的原因。
- 支持以下规则模式:例如(以下示例用于抑制某一行中的违规):
<rule-id>|<rule-category>|ALL
抑制 PB.TYPO.TLS 规则:
// parasoft-suppress PB.TYPO.TLS
- 抑制 CODSTA 分类中的所有规则:
// parasoft-suppress CODSTA
- 抑制 CODSTA 分类中严重级别为 4 及以下的所有规则:
// parasoft-suppress CODSTA-4
- 抑制多个规则:
// parasoft-suppress SECURITY.WSC.SL BD.PB.VOVR CWE.563.VOVR
- 抑制所有规则:
// parasoft-suppress ALL
在抑制文件中定义抑制
要抑制报告特定的任务,可以创建 parasoft.suppress 文件,指定需要抑制的任务属性。抑制文件应位于与包含相应任务的源文件所在的目录中,或者,您也可以在其他设定窗口中使用 suppression.infile.location
选项指定其位置(请参阅配置其他设置)。此选项指定用于同时抑制 CLI 和 IDE 中违规的抑制文件的位置。抑制文件的位置可以:
- 使用绝对路径定义
- 使用以下属性定义:
${file_name}
、${file_loc}
和${project_loc}
,例如${file_loc}/parasoft.suppress
例如:suppression.infile.location=C:/parasoft/suppression/storage/parasoft.suppress
我们建议将抑制文件签入您的源码控制系统中。这样,您就可以与其他团队成员共享关于抑制的信息,并在将代码合并到开发的主分支(如“master”、“trunk”等)之前,在 SCM 资源库中轻松查看分支上的抑制。
使用以下格式将抑制条目添加到 parasoft.suppress 文件:
suppression-begin file: Account.java (required) line: 12 (optional) rule-id: CODSTA-4 (optional) message: Exact violation message (optional) reason: Approved (optional) author: devel (optional) date: 2020-09-21 (optional) suppression-end
示例:
您至少需要指定检测到问题的源文件。这将抑制针对指定文件报告的所有任务。在下面的示例中,在 Account 文件中检测到的所有任务都会被抑制:
suppression-begin file: Account.java suppression-end
参数 | 说明 |
---|---|
? | 匹配一个字符的通配符(路径分隔符以外的任何字符) |
* | 匹配零个或多个字符的通配符(不包括路径分隔符) |
** | 匹配零个或多个路径段的通配符。 |
/ | 所有操作系统的分隔符 |
"[非字母数字字符]" | 当路径包含空格或其他非字母数字字符时,使用引号。 |
其他属性是可选的,可以帮助您调整抑制。在下面的示例中,PB.TYPO.TLS 规则在 Account 文件中检测到的所有任务都被抑制,无论这些任务出现在哪个代码行:
suppression-begin file: Account.java rule-id: PB.TYPO.TLS suppression-end
注意
- 建议阐明抑制的原因。
- 应谨慎使用
line
属性,因为在修改源文件时将代码移至另一行可能会使抑制失效。 rule-id
属性支持以下值:例如:<rule-id>|<rule-category>|ALL
抑制 PB.TYPO.TLS 规则:
suppression-begin file: **/autogenerated/* rule-id: PB.TYPO.TLS suppression-end
- 抑制 CODSTA 分类中的所有规则:
suppression-begin file: **/autogenerated/* rule-id: CODSTA suppression-end
- 抑制 CODSTA 分类中严重级别为 4 及以下的所有规则:
suppression-begin file: **/autogenerated/* rule-id: CODSTA-4 suppression-end
- 抑制所有规则:
suppression-begin file: **/autogenerated/* rule-id: ALL suppression-end
- 在
message
属性中,支持以下通配符:- ? - 任意字符
- * - 任意字符序列