Une erreur de code sur StackOverflow perpétue un bug depuis plus de 10 ans

par Korben -

Je suis tombé sur le thread Twitter d’un développeur répondant au doux pseudo de “Foone” qui a soulevé un problème que j’ai trouvé passionnant !

Savez-vous pourquoi, lorsque vous avez l’outil de gestion des drivers de Razer baptisé Synapse, Docker pour Windows ne veut pas se lancer ?

Oui c’est étrange. Mais vous allez voir, l’explication est folle.

A la base chacun de ces programmes est conçu pour être lancé une seule et unique fois. On ne peut pas lancer 2 docker.exe ou 2 synapse.exe en même temps. Pour cela, les développeurs des applications utilisent ce qui s’appelle un mutex (Exclusion mutuelle).

Jusque là rien d’anormal. Seulement, bizarrement, Docker et l’outil de Razer s’excluent l’un l’autre. En analysant un peu le code, foone a remarqué que pour fixer ce mutex global, les développeurs des 2 outils utilisaient ce code :

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

L’objectif est de récupérer l’identifiant unique du processus exécuter (GUID) pour empêcher qu’une seconde copie du programme ne soit lancée. Seulement, en observant le code, on peut voir que la fonction GetType() est utilisée. Cette fonction ne récupère pas l’instance en elle-même, mais le type de cette instance. Et ici l’instance n’est pas Docker ou Synapse, mais l’instance du framework .Net lui-même qui est utilisé pour faire tourner ces applications.

Et comme le GUID qui est récupéré ensuite est celui de l’instance .Net, et bien il est le même pour les 2 applications. D’où l’exclusion mutuelle.

Mais attendez, ce n’est pas tout. En creusant un peu, Foone s’est rendu compte que tout cela venait de Stack Overflow et plus exactement d’un certain Nathan qui en 2009 demandait comment récupérer ce GUID.

Et malheureusement, la top réponse qui lui ai donné contient la fameuse erreur.

1 an et 1 mois plus tard, un autre internaute indique qu’il y a une erreur et donne la bonne ligne de code. Malheureusement TROP TARD !

Et c’est comme ça que bientôt 11 ans plus tard, on se retrouve avec des erreurs de ce type dans nos outils récents.

Évidemment, pour empêcher cela, il aurait fallu que les développeurs de ces outils aillent au-delà du copier-coller, mais comment leur en vouloir, on fait tous ça ou presque.

Je copie, je colle, je compile, je regarde, ça marche, youpi et je passe à autre chose.

Toutefois, maintenant que vous savez, pensez à cette histoire la prochaine fois que vous copierez du code en provenance du net.

Il semblerait que Docker ait déjà corrigé le souci, libérant le mutex de Razer :).