[英]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.