SonarQube:忽略不使用正则表达式

时间:2016-11-15 11:34:19

标签: regex sonarqube sonarqube-scan sonarqube5.1

我按照有问题的说明进行操作 Ignore Issues in Blocks 但由于它不起作用,我怀疑它可能与正则表达式相关而不是声纳配置。

我有一些由EMF生成的代码。我更改了代码生成模板,以便在块的末尾添加// end-generated标记,如下所示:

/*
* @generated
*/
public class MyGeneratedClass implements Enumerator {

    /*
    * @generated
    */  
    public void myGeneratedMethod() {
        // some code that SonarQube doesn't like

    } //end-generated

}

这个想法是正则表达式必须只匹配方法块。因此START-BLOCK必须匹配文字 @generated ,只要在评论终止后没有跟上'class','enum'或'interface'字样。

我创建了这个正则表达式:

对于开始区块:

@generated\h*\s[\s\*]*\/(?!\s*[^\s]*\s*(class|enum|interface)\s)

对于结束块:

\/\/end-generated

这在我的测试中使用了一个带有Java Pattern类的简单代码,对于上面的类示例返回true:

public static void main(String[] args) throws IOException {
    String regex = "@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s)";
    String text = new String(Files.readAllBytes(Paths.get("test.txt")));
    Matcher matcher = Pattern.compile(regex).matcher(text);
    System.out.println(matcher.find());
}

但是,当我将其添加到SonarQube配置时,它不起作用,SonarQube仍会报告生成的方法中发现的问题。
我添加了正则表达式:
SonarQube»设置»排除»问题»忽略块中的问题

我也尝试使用转义版的正则表达式,结果是一样的:

@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s)

同样将这些设置直接添加到Sonar属性中也不起作用,正如我在上面提到的问题中已经报道的那样:

sonar.issue.ignore.block=rule1
sonar.issue.ignore.block.rule1.beginBlockRegexp=@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s)
sonar.issue.ignore.block.rule1.endBlockRegexp=\\/\\/end-generated

我正在使用SonarQube服务器5.1.2并运行Sonar-ant-task 2.3的分析。

我想知道使SonarQube无法匹配的正则表达式是否有问题,或者SonarQube正则表达式处理可能存在一些限制?

编辑:我更改了正则表达式,以便更简单地匹配'@generated'一词,并且它有效。但是如果我把'@generated [\ n \ r]'强制仅仅匹配@generated之后有一个新行,那么它就不再起作用了。
似乎SonarQube不支持新行字符等基本内容。有人可以证实这一点吗?

2 个答案:

答案 0 :(得分:1)

我确认用于排除问题的所有模式都是每行应用的。最后,它始终被翻译为"排除从第X行到第Y行和第34行的问题。我同意这不完美(特别是现在我们有精确的发行地点),但这是一个历史性的"特征。我们可能不会投入时间,因为我们的心情是避免复杂的配置。您的用例的理想解决方案是实施https://jira.sonarsource.com/browse/SONARJAVA-71

答案 1 :(得分:0)

由于SonarQube每行应用正则表达式,我为这个用例提出了不同的解决方案:

我使用每行的起始块正则表达式:(?m)@ generated $然后通过将此模式添加到end-block正则表达式以及结束生成来排除class | enum | interface。

最终配置如下所示:

sonar.issue.ignore.block=rule1
sonar.issue.ignore.block.rule1.beginBlockRegexp=(?m)@generated$
sonar.issue.ignore.block.rule1.endBlockRegexp=\/\/\h*end-generated|\sclass\s|\senum\s|\sinterface\s