Comment l'erreur de 2009 provoque un conflit entre Docker pour Windows et Razer Synapse

Aujourd'hui, je suis tombé sur un bug très intéressant: Docker pour Windows ne démarre pas si le panneau de configuration du pilote Razer Synapse est en cours d'exécution.

Mais la chose la plus intéressante est pourquoi c'est arrivé ...



Les deux applications sont écrites de sorte que vous ne pouvez exécuter qu'une seule instance à la fois. Pour ce faire, ils créent un mutex global en utilisant l'assembly .NET comme clé GUID, non?

Mais hélas, ils se trompent et, de plus, ils se trompent également. Le code d'erreur ressemble à ceci:

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

L'idée est d'obtenir le GUID de l'assembly exécutable et de créer un mutex basé sur celui-ci qui empêchera plus d'une instance de démarrer.

Mais cela doit être faux. Il ne devrait pas y avoir d'appel GetType().

Cette option ne renvoie pas le GUID d'un assembly particulier, mais le GUID d'un type intégré à .NET qui décrit les assemblys en tant que tels - System.Reflection.RuntimeAssembly.

Par conséquent, lorsqu'ils créent des mutex, ils n'utilisent pas les GUID de leur propre code, mais les GUID des internes .NET. Et pour les deux applications, ce GUID sera le même.

Comment est-ce arrivé? C'est drôle, mais nous savons exactement comment. Stackoverflow est à blâmer!

En 2009, un utilisateur avec le surnom Nathan a posé la question - " comment obtenir le GUID de l'assemblage en cours?". Après 12 minutes, l'utilisateur Cerebrus lui a répondu, mais il y avait une erreur dans sa réponse.

Après un an et un mois, l'utilisateur Yoopergeek indique une erreur. Cerebrus revient trois ans plus tard et corrige sa réponse - mais vous ne pouvez pas le supprimer car la réponse a été marquée comme «acceptée».

Ainsi, une erreur dans la réponse à une question en 2009 a provoqué un bogue qui existait au moins jusqu'en mars 2018.

Devoirs pour tous les programmeurs lisant ce post: pensez à comment vous trouveriez un tel bogue dans votre application? le code semble fonctionner, mais vous ne réalisez même pas qu'il est réellement cassé: vous n'exécutez pas deux programmes avec la même erreur en même temps, vous ne serez informé du problème que lorsque les utilisateurs commenceront à se plaindre.

Comment le processus de développement pourrait-il être modifié pour détecter de telles erreurs avant la publication?

All Articles