Компилятор Java выполняет возврат перед оператором if - PullRequest
0 голосов
/ 19 сентября 2019

Есть ли вероятность, что java compiler игнорирует if statement в java при оптимизации?

У нас две среды [A и B идентичны] и один и тот же код развернут в обеихсреды.В коде есть один метод, который имеет следующий код:

private LocaleCodeValue getDefaultLocaleCodeValue(String code) {
String value = code;
if (code.contains("_")) value = code.substring(0, code.lastIndexOf("_"));
return new LocaleCodeValue(code, value);
}

Это должно работать в обеих средах.

Однако в среде B иногда игнорируют оператор if и напрямую возвращают объект, пока условие истинно.Для отладки мы выполнили действия, которые приведут к условию true.Это работает для AN A, но не B (иногда).Но мы на 100% уверены, что условие всегда выполнялось. после многих дней отладки мы пришли к выводу, что вполне возможно, что JIT-компилятор оптимизирует код и может игнорировать оператор if.

Итак, мы изменили код следующим образом:

private LocaleCodeValue getDefaultLocaleCodeValue(String code) {
    String value = code;
    if (code.contains("_")) {
     value = code.substring(0, code.lastIndexOf("_"));
     return new LocaleCodeValue(code, value);
    }
    return new LocaleCodeValue(code, value);
    }

и теперь код работает, как и ожидалось.

Я согласен, что эту проблему очень сложно воспроизвести, однакоМне любопытно, кто-то сталкивался с такой проблемой?или есть вероятность того, что Java-компилятор возиться с этим?

Java Image : image: openjdk:10-jdk-slim

1 Ответ

4 голосов
/ 19 сентября 2019

Есть ли вероятность того, что Java-компилятор возится с этим?

Теоретически да.Это математически возможно.

На практике ... более вероятно, что вы либо что-то упустили, либо у вас неправильное представление о каком-либо аспекте поведения Java.(Например, что делает программу поточно-ориентированной.)

Java используется миллионами программистов.Ошибки действительно обнаруживаются, но вероятность того, что любое непредвиденное / непонятное поведение в каком-то "обычном" коде связано с ошибкой компилятора, ничтожна.

(И, кроме того, если вы не можете предоставить доказательства предполагаемогоошибка компилятора в виде воспроизводимого тестового примера:

  1. вы не сможете сообщить об этом / получить исправление, а
  2. у вас не будет логическая основа для веры в то, что ваш обходной путь на самом деле лечит проблему. (Это может быть просто уменьшение вероятности или перемещение в другое место).

Кодесть один метод, который имеет код, подобный приведенному ниже:

(Это реальный код? Или он просто «как»? И если он просто «как», то чем он отличается отреальный код?)

private LocaleCodeValue getDefaultLocaleCodeValue(String code) {
    String value = code;
    if (code.contains("_")) 
        value = code.substring(0, code.lastIndexOf("_"));
    return new LocaleCodeValue(code, value);
}

Возможность № 0. Проблема в том, что ввод или вывод этого метода не тот, который вы думаете. (Принимая во внимание, что если приложение многопоточное, использование отладчика или рекламыТрассировка или регистрация могут изменить поведение приложения.Таким образом, чтобы скрыть фактические доказательства.)

Возможность # 1.Проблема в конструкторе LocaleCodeValue.

Возможность # 2.Гомоглифы: при некоторых обстоятельствах вы получаете некоторый персонаж, который выглядит как '_' символ, но на самом деле это не так.

Возможность № 3.Где-то еще в базе кода есть некоторый код, который использует мерзкое отражение, чтобы изменить значения String, и это просто происходит, чтобы изменить значение code.Это может даже не происходить во время вызова этого метода ... если это происходит в другом потоке.

Возможность # 4.Где-то в кодовой базе вызывается какой-то ошибочный нативный код, и это что-то попирает.

Возможность # 5.Аппаратная ошибка.

Возможность # 6.Код, который вы запускаете, не соответствует исходному коду, который вы просматриваете;Например, у вас есть проблемы с процессами сборки или развертывания.

и

Возможность # 7.Существует небольшая, но важная разница между тем, что вы нам показали, и реальным кодом.

Моя ставка будет на # 0, # 6 или # 7 (за исключением того, что вы только что сказали не # 7).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...