Después de actualizar recientemente a .net 4.6, descubrimos un error en el que RyuJit produce resultados incorrectos. Por ahora, pudimos solucionar el problema agregando useLegacyJit enable="true" a 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 Lanzamiento, Cualquier CPU, sin marcar Preferir 32 bits, ejecutar con y sin depurador adjunto 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(); } } } }Debería producir: Falso Falso
pero en cambio produce: Verdadero Falso
La parte clave del ejemplo es
result = true ? false : result;Que siempre debería devolver falso, pero como puede ver en la salida, devuelve Verdadero 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 siempre devuelva True, pero el ejemplo dado es lo más cercano que pude reproducir a nuestro escenario de producción real.
Gracias por el programa de reproducción aislado y puedo confirmar que, de hecho, se trata de un error de RyuJIT en el optimizador que quedó expuesto debido a la inserción. Hice una corrección en el compilador y calculé los detalles de implementación. No para convertir SO en un rastreador de errores y para una respuesta más rápida: ryujit@microsoft.com.