【问题标题】:Sonarqube:Java is not catching "Double-checked Locking" (S2168)Sonarqube:Java 没有捕捉到“双重检查锁定”(S2168)
【发布时间】:2018-04-09 21:26:40
【问题描述】:

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

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

有罪的代码片段:

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

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

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

干净安装: - 码头工人:sonarqube:高山(7.0)

更新(2018 年 4 月 11 日)

我创建了一个只有 2 个方法的简单类。它们与原始代码相同,除了一个使用 volatile 而另一个不使用。我通过 SQ 运行它,两种方法都没有标记为进行仔细检查。 - SonarJava:5.2(内部版本 13398)

更新(2018 年 4 月 12 日)

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

/** 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;
}

【问题讨论】:

  • instance 被声明为 volatile 吗?
  • 私有静态易失
  • 我猜 SonarQube 只是在这方面更聪明;虽然执行 DCL 很少是一个好主意,但这似乎是一种有效的使用方式。
  • 你是否建议我运行相同的代码,但没有 volatile,它会被拾取?
  • 遗憾的是,没有这样的运气。它仍然没有被标记。

标签: java sonarqube double-checked-locking


【解决方案1】:

你击中了一个 False Positive Negative(@benzonico 正确地指出它不是 False Positive 而是 False Negative)。我向 SonarQube 分发列表 (https://groups.google.com/d/topic/sonarqube/1UXBR9eZydU/discussion) 发送了一封包含详细信息的电子邮件:

你好,

当以其他方法分配实例时,Adam L 在 S2168 规则中出现误报。他在 Stack Overflow 上添加了一个帖子Sonarqube:Java is not catching "Double-checked Locking" (S2168)(我为交叉发帖道歉),今天我终于确认问题是由规则引起的。

环境:

  • SonarQube 7.0
  • SonarJava 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,问题被标记为已修复。

【讨论】:

  • 非常感谢您的帮助和参与寻找解决方案!
  • 快速说明:这是一个错误的否定(问题存在但未找到)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
相关资源
最近更新 更多