RyuJit 产生不正确的结果

2024-01-11

最近升级到 .net 4.6 后,我们发现 RyuJit 产生错误结果的错误,我们现在可以通过在 app.config 中添加 useLegacyJitenabled="true" 来解决该问题。

如何调试以下生成的机器代码?

我在 VS 2015 RTM 中创建了一个新的控制台项目,设置为“Release”、“Any CPU”,未选中“Prefer 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();
            }
        }
    }
}

它应该产生: 错误的 错误的

但它会产生: 真的 错误的

该示例的关键部分是

result = true ? false : result;

它应该始终返回 false,但正如您从输出中看到的那样,它在第一次运行该方法时返回 True,而在第二次运行该方法时返回不同的答案。从Calculate() 方法中删除更多行将导致它始终返回True,但给出的示例是我可以重现的最接近实际生产场景的示例。


感谢您提供隔离的重现程序,我可以确认这确实是优化器中的 RyuJIT 错误,该错误由于内联而暴露。我已经修复了编译器并确定了推出细节。不要将 SO 变成错误跟踪器,并且为了更快的周转:[电子邮件受保护] /cdn-cgi/l/email-protection.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RyuJit 产生不正确的结果 的相关文章

随机推荐