繁体   English   中英

Sonarqube:Java没有捕获“双重检查锁定”(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”上运行了该文件,该文件似乎在其列表中。 对于咧嘴笑,我基于“声纳方式”创建了一个新的配置文件,然后添加了“ Findbugs Security Audit”中的所有内容,但是也没有找到代码段。

对我可能会缺少的东西有什么想法吗?

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

更新(4/11/18)

我创建了一个仅包含2个方法的简单类。 它们与原始代码相同,除了一个使用volatile,而另一个不使用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正确地指出它不是假阳性而是假阴性)。 我已将包含详细信息的电子邮件发送到SonarQube分发列表( https://groups.google.com/d/topic/sonarqube/1UXBR9eZydU/discussion ):

你好,

当用其他方法分配实例时,亚当·L在S2168规则中误判为肯定。 他在Stack Overflow Sonarqube上添加了一篇文章:Java没有捕获到“双重检查锁定”(S2168) (我为交叉发布表示歉意),今天我终于确认问题是由规则引起的。

环境:

  • 声纳Qube 7.0
  • 声纳Java 5.2

示例类: https : //github.com/agabrys/sonarqube-falsepositives/blob/master/src/main/java/biz/gabrys/agabrys/sonarqube/falsepositives/d20180415/S2168.java

项目: https//github.com/agabrys/sonarqube-falsepositives

内部版本:MVN Clean Package声纳

问候

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

  • 将创建处理它的票证
  • 他们将决定不修复它

编辑:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM