True or False or False = False

    image Интересный и волнующий баг сегодня нашел в Delphi XE5 и опубликовал владелец g+ комьюнити Delphi Developers, Lars Fosdal.

    При некоторых условиях, True or False or False вычисляется в False, при этом (True or False or False) вычисляется в ожидаемое True.
    В комментариях также замечают, что был случай когда x := True or True or True также выдавал False

    Баг плавающий, и после очистки и пересборки проекта с нуля, он прошел.

    Ниже, под спойлером, приведены скриншоты обсуждения
    Скрины
    image
    image


    Всем пользователям XE5 настоятельно рекомендую покрывать юнит-тестами даже самые очевидные места.
    Share post

    Similar posts

    Comments 17

      +1
      Иногда бывает, что IDE-отладчик не справляется с кодом, генерируемым в режиме оптимизации. Оптимизатор же в Delphi может делать очень интересные вещи — может например, перевернуть цикл вверх ногами (i заменить на n-i). Не удивлюсь, если он и с булевскими значениями может что-нибудь сделать. Рекомендую при отладке снимать галочку оптимизация в компиляторе. (Хотя может в данном посте — не этот случай, но то, что глюк исчез при пересборке проекта очень напоминает ситуацию с оптимизацией)
        0
        и, судя по всему, не лениться делать полный Build
        0
        а еще значение Boolean(2) может вызывать еще более волшебные баги. Вроде как я помню, оно не будет являться ни True, ни False, но boolean.
          –2
          а еще значение Boolean(2) может вызывать еще более волшебные баги

          а уж какие волшебные баги может вызвать код PInteger(Random())^ := Random();
          0
          Встречал подобное в XCode, раза два или три. Тоже Clean помогает.
            –2
            Если бы это был open source, уже было бы описание бага: где, почему, когда возникает. И фикс.
              +6
              Вы OpenSSL видели?
              Пора уже прекращать эти суеверия, что OpenSource это панацея.

              Во что переварится сам продукт, так и говорить не хочется.
                +2
                Кстати, один из самых ужасных открытых проектов.
                  +1
                  Ну да, я не я, лошадь не моя, и вообще они сами виноваты…
                  +1
                  OpenSSL не видел. Видел Perl и Ruby (это всё же языки программирования, с ними лучше сравнивать), наблюдал за багами, если что-то такое серьёзное нашлось бы, за пару дней обязательно был бы анализ бага и фикс, если он тривиален.
                    –1
                    Ну-ну.
                    Минимум раз в месяц слышу плач питонистов по юникоду в коде.
                      0
                      Это не баг а фича, совсем не то. Не такая серьёзная проблема как описывается в статье.
                      Непофикшенных багов и не сделанных фичей полно везде (тем более если их не делают из соображений обратной совместимости итд)
                +1
                Очередные ужасы Дельфийского городка.
                На самом деле сам наступал на пару багов, пояснить которые оказалось невозможно, при этом в XE4 все прекрасно работает, а в XE5 через раз на пустом месте выскакивают ошибки. Пока как и остальные невезунчики остаюсь на младших версиях продукта.
                Жаль, но последнее время после большого затишья с момента Delphi 7, с дикой силой погнались за скоростью релизов RAD студии, учитывая стоимость обновления не каждый готов приобрести новую версию, не изобилующую особыми преимуществами (о мобильных разработках под Android и iOS я политкорректно умолчу), а значит количество найденных пользователями и починенных глюков будет меньше, нежели если бы был более долгий цикл жизни. Опять же, при использовании сторонних библиотек в разработке те не успевают обновляться под новые причуды рефакторинга кода в Delphi, когда уже трудно понять, в каком юните следует искать ту или иную функцию. Половина кода при переходе на новую версию при сборке начинает кричать про deprecated, и не дай бог придется использовать сразу две среды разработки, ад компиляторных директив обеспечен, как и жуткое состояние читаемости кода после этого.
                Учитывая «расторопность» разработчиков Delphi в починке багов, висящих годами, стоимость продукта, я вижу хотя-бы 3-х летний цикл как мало приемлемый вариант.
                А пока только увы и ах.
                  0
                  Хм… Действительно «баг в компиляторе». Мемы выбираются в реальность!
                    0
                    This is MAGIC
                      0
                      Скорее всего, просто в переменную запихивают число.
                      Воспроизводимого тест-кейса-то нет.
                        +1
                        В какой-то прошлой XE не работал string.trim(). Когда увидел — долго ржал, как такое могло выйти из beta.
                        Плюс во всех последних версиях возможно AV на пустом месте из-за подсчета refCnt у строк. В общем весело там.

                        Only users with full accounts can post comments. Log in, please.