gpt4 book ai didi

c# - RyuJit 产生不正确的结果

转载 作者:IT王子 更新时间:2023-10-29 04:03:50 27 4
gpt4 key购买 nike

在最近升级到 .net 4.6 之后,我们发现了一个错误,RyuJit 会产生不正确的结果,我们现在可以通过在 app.config 中添加 useLegacyJit enabled="true"来解决这个问题。

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

我在 VS 2015 RTM 中创建了一个新的控制台项目,设置为 Release,Any CPU,未选中 Prefer 32 bit,在附加和不附加调试器的情况下运行产生相同的结果。

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 变成错误跟踪器,并且为了更快的周转:ryujit@microsoft.com。

关于c# - RyuJit 产生不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31570521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com