本主题说明如何在源代码或抑制文件中手动抑制 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
您可以使用以下通配符和其他参数来指定文件路径(这种方式适用于在“其他设定”窗口中配置非默认的 parasoft.suppress 文件位置):

参数说明
?匹配一个字符的通配符(路径分隔符以外的任何字符)
*匹配零个或多个字符的通配符(不包括路径分隔符)
**匹配零个或多个路径段的通配符。
/所有操作系统的分隔符
"[非字母数字字符]"当路径包含空格或其他非字母数字字符时,使用引号。

其他属性是可选的,可以帮助您调整抑制。在下面的示例中,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 属性中,支持以下通配符:
    • ? - 任意字符
    • * - 任意字符序列

  • No labels