SonarQube:忽略不适用于正则表达式的块中的问题

SonarQube: Ignore issues in blocks not working with regex

我遵循了相关说明 但由于它不起作用,我怀疑它可能与正则表达式有关,而不是与 Sonar 配置有关。

我有一些由 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 模式 class 的简单代码,对于上面的 class 示例 returns 为真:

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 不支持换行符等基本内容。有人可以确认吗?

我确认用于排除问题的所有模式都是逐行应用的。最后总是翻译成"exclude issues from line X to line Y"。我同意这并不完美(尤其是现在我们有精确的问题定位)但这是一个 "historical" 功能。我们可能不会在上面投入时间,因为我们的心情是避免复杂的配置。您的用例的理想解决方案是实施 https://jira.sonarsource.com/browse/SONARJAVA-71

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

我每行使用开始块正则表达式:(?m)@generated$ 然后通过将此模式添加到结束块正则表达式来排除 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