我有一个Comparator,在比较它们的内容之前检查两个对象的“null”。 比较方法如下所示:
public int compare(MyClass left, MyClass right) {
if (left == null) {
return right == null ? 0 : 1;
}
if (right == null) {
return -1;
}
// do some other comparing
}
当我通过声纳代码质量检查工具运行它时,它会在if语句中报告“不兼容的位掩码”错误。 (它的内容类似于:“正确性 - 不兼容的位掩码:(e | 0x1 = 0x0)中不兼容的位掩码产生恒定的结果....比较(MyClass,MyClass)我看不出这是怎么回事。可以任何人对此有所了解?这是一个误报吗?
顺便说一下,我使用的声纳版本是2.6。
答案 0 :(得分:6)
我相信我知道发生了什么。我相信你的代码是由Clover编织的,而三叶草代码则修饰了代码,并且它的编写方式并不是那么干净。
44: sipush 14625
47: invokevirtual #10; //Method com_cenqua_clover/CoverageRecorder.iget:(I)I
50: ifeq 57
53: iconst_1
54: goto 58
57: iconst_0
58: iconst_1
59: ior
60: ifne 85
这就是FindBugs所抱怨的。
答案 1 :(得分:-4)
public int compare(MyClass left, MyClass right) {
if (left == null) {
return right == null ? 0 : 1;
}
if (right == null) {
return -1;
}
// do some other comparing
}
这段代码甚至不应该编译,因为在方法签名中你已经同意这个方法将返回int类型但是因为它只有if语句,所以在某些情况下它甚至可能不会返回一个值。
现在来到你的“不兼容的位掩码”问题是因为对于(right == null),该方法似乎返回两个值,即0和1,尽管两者都不在同一时间。您的工具声纳代码质量检查似乎该方法为同一比较返回两个不同的值,因此一个值有时可能隐藏另一个值。