Sonarqube:Java 没有捕捉到 "Double-checked Locking" (S2168)

Sonarqube:Java is not catching "Double-checked Locking" (S2168)

我们已经通过 Fortify 开始 运行 我们的代码,作为练习,我想看看 Sonarqube 是否会解决任何相同的问题。

我无法复制的第一个是 S2168:Double-Checked Locking

有罪的代码片段:

if (instance == null)
    {
        // thread safe singleton
        synchronized (ESSingletonClient.class)
        {
            if (instance == null) // doubly check
            {
               ...stuff
            }
        }
    }

我在默认质量配置文件 Sonar Way 中 运行 这个,它的列表中似乎有这个。对于 grins,我创建了一个基于 "Sonar Way" 的新配置文件,然后添加了 "Findbugs Security Audit" 中的所有内容,但这也没有找到代码段。

关于我可能遗漏的任何想法?

全新安装: - Docker: sonarqube:alpine (7.0)

更新(2018 年 4 月 11 日)

我创建了一个简单的 class,只有 2 个方法。它们与原始代码相同,除了一个使用 volatile 而另一个不使用。我通过 SQ 运行 它,并且没有标记任何方法进行双重检查。 -SonarJava:5.2(内部版本 13398)

更新(4/12/18)

添加了对变量的赋值,调用了另一个方法,就像在我们的原始代码中所做的那样。仍然没有被标记。

/** volatile instance. */
private static volatile Integer v_instance = null;
/** non-volatile instance. */
private static Integer n_instance = null;

public static void getVolatileInstance() 
{
    if (v_instance == null)
    {
        // thread safe singleton
        synchronized (DoubleCheck.class)
        {
            if (v_instance == null) // doubly check
            {
                assignVolatile(5);
            }
        }
    }
}
public static void getNonVolatileInstance() 
{
    if (n_instance == null)
    {
        // thread safe singleton
        synchronized (DoubleCheck.class)
        {
            if (n_instance == null) // doubly check
            {
               assignNonVolatile(6);
            }
        }
    }
}    

public static void assignVolatile(Integer value)
{
    v_instance = value;
}

public static void assignNonVolatile(Integer value)
{
    n_instance = value;
}

你打错了正面负面(@benzonico rightly pointed out that it is not a False Positive but False Negative). I sent an email with detailed information to SonarQube distribution list (https://groups.google.com/d/topic/sonarqube/1UXBR9eZydU/discussion):

Hello,

Adam L hit a false positive in the S2168 rule when an instance is assigned in an other method. He added a post on Stack Overflow (I apologize for cross-posting) and today I finally confirmed that the problem is caused by the rule.

Environment:

  • SonarQube 7.0
  • SonarJava 5.2

Example class: https://github.com/agabrys/sonarqube-falsepositives/blob/master/src/main/java/biz/gabrys/agabrys/sonarqube/falsepositives/d20180415/S2168.java

Project: https://github.com/agabrys/sonarqube-falsepositives

Build: mvn clean package sonar

Regards

现在我们必须等待有两种可能性的答案:

  • 将创建处理它的工单
  • 他们会决定不修复它

编辑:

我将 SonarJava 从 5.2 升级到 5.5,问题已标记为已修复。