【发布时间】: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