remarks generate c# jit c#-6.0 .net-4.6 ryujit

c# - generate - RyuJit produce resultados incorrectos



summary c# documentation (1)

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 para Liberar, Cualquier CPU, sin marcar Preferencia 32 bits, ejecutándose 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: False False

sino que produce: Verdadero Falso

La parte clave del ejemplo es

result = true ? false : result;

Lo cual siempre debería devolver falso, pero como puede ver en el resultado, 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 el más cercano que pude reproducir a nuestro escenario de producción real.


Gracias por el programa de repro aislado y puedo confirmar que este es de hecho un error de RyuJIT en el optimizador que quedó expuesto debido a la incorporación. He corregido el compilador y me figuré los detalles de la implementación. No convertir SO en un rastreador de errores, y para un cambio más rápido: [email protected].