RyuJit produce resultados incorrectos
Después de actualizar recientemente a .net 4.6 descubrimos un error en el que RyuJit produce resultados incorrectos, pudimos solucionar el problema por el momento agregando useLegacyJit enabled = "true" a la app.config.
¿Cómo puedo depurar el código de máquina generado por lo siguiente?
Creé un nuevo proyecto de consola en VS 2015 RTM, configurado en Release, Any CPU, sin marcar Preferir 32 bits, ejecutar con y sin depurador conectado produce el mismo resultado.
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();
}
}
}
}
Debe producir: Falso Falso
pero en cambio produce: Verdadero Falso
La parte clave del ejemplo es
result = true ? false : result;
Lo que siempre debe devolver falso, pero como puede ver en la salida, devuelve True la primera vez que se ejecuta el método, y una respuesta diferente la segunda vez que se ejecuta el método. Eliminar algunas líneas más del método Calculate () hará que devuelva True siempre, pero el ejemplo dado es lo más cercano que podría reproducir a nuestro escenario de producción real.