查找错误报告了一个不兼容的位掩码错误,但我看不出如何



我有一个比较器,在比较两个对象的内容之前检查它们的"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)中不兼容的位掩码在....中产生恒定的结果我看不出这是怎么回事。有人能解释一下吗?这是假阳性吗?

顺便说一下,我使用的声纳版本是2.6.

我想我知道是怎么回事。我相信你的代码是由三叶草编织的,而三叶草的代码是对代码的修饰,而它的修饰方式并不那么干净。

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抱怨的

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,尽管两者都不是在同一时间。它出现在你的工具声纳代码质量检查,该方法是返回两个不同的值为相同的比较,因此一个值有时可能隐藏另一个值。

相关内容

最新更新