Cómo el error de 2009 causa un conflicto entre Docker para Windows y Razer Synapse

Hoy me encontré con un error muy interesante: Docker para Windows no se iniciará si tienes el panel de control del controlador Razer Synapse ejecutándose.

Pero lo más interesante es por qué sucedió ...



Ambas aplicaciones están escritas para que pueda ejecutar solo una instancia a la vez. Para hacer esto, crean un mutex global utilizando el ensamblado .NET como clave GUID, ¿verdad?

Pero, por desgracia, lo están haciendo mal y, además, están igualmente equivocados. El código de error se parece a esto:

string.Format("Global\{0}", (object) Assembly.GetExecutingAssembly().GetType().GUID);

La idea es obtener el GUID del ensamblaje ejecutable y crear un mutex basado en él que evitará que se inicie más de una instancia.

Pero debe estar mal. No debería haber una llamada GetType().

Esta opción no devuelve el GUID de un ensamblado en particular, sino el GUID de un tipo integrado en .NET que describe los ensamblados como tales System.Reflection.RuntimeAssembly.

Por lo tanto, cuando crean mutexes, no usan los GUID de su propio código, sino los GUID de los componentes internos de .NET. Y para ambas aplicaciones, este GUID será el mismo.

¿Cómo pasó esto? Es gracioso, pero sabemos exactamente cómo. ¡Stackoverflow tiene la culpa!

En 2009, un usuario con el apodo de Nathan hizo la pregunta: " ¿cómo obtener el GUID del ensamblaje que se realiza?". Después de 12 minutos, el usuario Cerebrus le respondió, pero hubo un error en su respuesta.

Después de un año y un mes, el usuario Yoopergeek indica un error. Cerebrus regresa tres años más tarde y corrige su respuesta, pero no puede eliminarla porque la respuesta ha sido marcada como "aceptado".

Por lo tanto, el error al responder la pregunta en 2009 causó un error que existía al menos hasta marzo de 2018.

Tarea para todos los programadores que leen esta publicación: ¿piensan cómo encontrarían ese error en su aplicación? parece funcionar el código, pero ni siquiera te das cuenta de que está realmente roto: no ejecutas dos programas con el mismo error al mismo tiempo, solo sabrás sobre el problema cuando los usuarios comiencen a quejarse.

¿Cómo podría cambiarse el proceso de desarrollo para detectar tales errores antes de su lanzamiento?

All Articles