Подтвердить что ты не робот

RyuJit производит неправильные результаты

После обновления до .net 4.6 мы обнаружили ошибку, в которой RyuJit выводит неверные результаты, теперь мы смогли обойти эту проблему, добавив в app.config useLegacyJit enabled = "true".

Как я могу отладить машинный код, сгенерированный следующим?

Я создал новый консольный проект в VS 2015 RTM, настроен на Release, любой CPU, unchecked Предпочитаю 32 бит, работающий с приложением отладчика и без него, дает тот же результат.

using System;
using System.Runtime.CompilerServices;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Calculate());
            Console.WriteLine(Calculate());

            Console.ReadLine();
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static Value Calculate()
        {
            bool? _0 = (bool?)null;
            bool? _1 = (bool?)true;
            if (!Value.IsPresent<bool>(_1))
            {
                return default(Value);
            }

            bool? result = null;
            result = (_1.Value ? new bool?(false) : result);
            if (_0.HasValue && _0.Value)
            {
            }
            return new Value(result);
        }

        public struct Value
        {
            bool? _value;

            public Value(bool? value)
            {
                _value = value;
            }

            public static bool IsPresent<T>(bool? _)
            {
                return _.HasValue;
            }

            public override string ToString()
            {
                return _value.ToString();
            }
        }
    }
}

Он должен производить: Ложь False

но вместо этого он производит: Правда False

Ключевой частью примера является

result = true ? false : result;

Который всегда должен возвращать false, но, как вы можете видеть из вывода, он возвращает True при первом запуске метода и другой ответ во второй раз, когда этот метод запущен. Удаление некоторых строк из метода Calculate() приведет к тому, что он всегда будет возвращать True, но приведенный ниже пример является самым близким, который я мог бы воспроизвести в нашем фактическом сценарии производства.

4b9b3361

Ответ 1

Спасибо за изолированную программу воспроизведения, и я могу подтвердить, что это действительно ошибка RyuJIT в оптимизаторе, который был выставлен из-за inlining. Я сделал исправление для компилятора и выяснил подробности развертывания. Не превращать SO в трекер ошибок и для более быстрого поворота: [email protected]