Wie der Fehler von 2009 einen Konflikt zwischen Docker für Windows und Razer Synapse verursacht

Heute bin ich auf einen sehr interessanten Fehler gestoßen: Docker für Windows wird nicht gestartet, wenn das Bedienfeld des Razer Synapse-Treibers ausgeführt wird.

Aber das Interessanteste ist, warum es passiert ist ...



Beide Anwendungen sind so geschrieben, dass Sie jeweils nur eine Instanz ausführen können. Dazu erstellen sie einen globalen Mutex mit der .NET-Assembly als GUID-Schlüssel, oder?

Aber leider machen sie es falsch und darüber hinaus sind sie genauso falsch. Der Fehlercode sieht ungefähr so ​​aus:

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

Die Idee ist, die GUID der ausführbaren Assembly abzurufen und darauf basierend einen Mutex zu erstellen, der verhindert, dass mehr als eine Instanz gestartet wird.

Aber es muss falsch sein. Es sollte keinen Anruf geben GetType().

Diese Option gibt nicht die GUID einer bestimmten Assembly zurück, sondern die GUID eines in .NET integrierten Typs, der Assemblys als solche beschreibt System.Reflection.RuntimeAssembly.

Daher verwenden sie beim Erstellen von Mutexen keine GUIDs aus ihrem eigenen Code, sondern GUIDs aus .NET-Interna. Und für beide Anwendungen ist diese GUID gleich.

Wie ist es passiert? Komisch, aber wir wissen genau wie. Stackoverflow ist schuld!

Im Jahr 2009 stellte ein Benutzer mit dem Spitznamen Nathan die Frage: " Wie erhält man die GUID der durchgeführten Assembly?". Nach 12 Minuten antwortete ihm der Benutzer Cerebrus, aber es gab einen Fehler in seiner Antwort.

Nach einem Jahr und einem Monat zeigt der Benutzer Yoopergeek einen Fehler an. Cerebrus kehrt drei weitere Jahre später zurück und korrigiert seine Antwort - Sie können sie jedoch nicht löschen, da die Antwort markiert wurde als "akzeptiert"

. Ein Fehler bei der Beantwortung einer Frage im Jahr 2009 verursachte daher einen Fehler, der mindestens bis März 2018 bestand.

Hausaufgaben für alle Programmierer, die diesen Beitrag lesen: Überlegen Sie, wie Sie einen solchen Fehler in Ihrer Anwendung finden würden? Der Code scheint zu funktionieren, aber Sie merken nicht einmal, dass er tatsächlich defekt ist: Sie führen nicht zwei Programme mit demselben Fehler gleichzeitig aus. Sie werden das Problem nur kennen, wenn Benutzer anfangen, sich zu beschweren.

Wie könnte der Entwicklungsprozess geändert werden, um solche Fehler vor der Veröffentlichung zu erkennen?

All Articles