Findbugs сообщает о несовместимой ошибке в битовой маске, но я не понимаю, как - PullRequest
3 голосов
/ 14 апреля 2011

У меня есть Comparator, который проверяет «ноль» на наличие двух объектов перед сравнением их содержимого. Метод сравнения выглядит так:

    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.

Ответы [ 2 ]

6 голосов
/ 18 апреля 2011

Мне кажется, я знаю, что происходит. Я полагаю, что ваш код сплетен с помощью 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.

0 голосов
/ 20 декабря 2012
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, но поскольку он имеет значение только в том случае, если утверждение возможно, в некоторых случаях он может даже не возвращать значение.

Теперь перейдем к вашему вопросу «Несовместимые битовые маски», потому что для (right == null) кажется, что метод возвращает два значения, то есть 0 и 1, хотя оба не в одно и то же время. При проверке качества кода сонара вашего инструмента кажется, что метод возвращает два разных значения для одного и того же сравнения, и, следовательно, одно значение может иногда скрывать другое значение.

...