كيف يتسبب الخطأ من عام 2009 في حدوث تعارض بين Docker لـ Windows و Razer Synapse

اليوم صادفت خللاً مثيرًا للاهتمام للغاية: لن يبدأ Docker لـ Windows إذا كان لديك لوحة تحكم برنامج تشغيل Razer Synapse قيد التشغيل.

لكن الشيء الأكثر إثارة للاهتمام هو لماذا حدث ذلك ...



يتم كتابة كلا التطبيقين بحيث يمكنك تشغيل مثيل واحد فقط في كل مرة. للقيام بذلك ، يقومون بإنشاء كائن مزامنة عالمي باستخدام تجميع .NET كمفتاح GUID ، أليس كذلك؟

لكن للأسف ، إنهم يفعلون ذلك بشكل خاطئ ، وعلاوة على ذلك ، فهم على خطأ بنفس القدر. يبدو رمز الخطأ كالتالي:

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

الفكرة هي الحصول على GUID للتجميع القابل للتنفيذ وإنشاء كائن مزامنة يستند إليه يمنع أكثر من مثيل واحد من البدء.

لكن يجب أن يكون خطأ. لا ينبغي أن يكون هناك مكالمة GetType().

لا يعيد هذا الخيار GUID الخاص بتجميع معين ، ولكن GUID من نوع مضمّن في .NET يصف التجميعات على هذا النحو - System.Reflection.RuntimeAssembly.

لذلك ، عند قيامهم بإنشاء كائنات مشتركة ، لا يستخدمون المعرفات الفريدة العمومية من التعليمات البرمجية الخاصة بهم ، ولكنهم يستخدمون المعرفات الفريدة العمومية من .NET الداخلية. وبالنسبة لكلا التطبيقين ، سيكون هذا المعرف الفريد العمومي هو نفسه.

كيف حدث هذا؟ مضحك ، لكننا نعرف كيف بالضبط . Stackoverflow هو المسؤول!

في عام 2009 ، سأل مستخدم يحمل اسم ناثان السؤال - " كيفية الحصول على المعرف الفريد العمومي للتجميع الذي يتم تنفيذه؟". بعد 12 دقيقة ، رد عليه المستخدم Cerebrus ، ولكن كان هناك خطأ في إجابته.

بعد عام وشهر ، يشير المستخدم Yoopergeek إلى خطأ. يعود Cerebrus بعد ثلاث سنوات أخرى ويصحح إجابته - ولكن لا يمكنك حذفه لأنه تم وضع علامة على الإجابة على أنه "مقبول".

وهكذا ، تسبب خطأ في الإجابة عن سؤال في عام 2009 في وجود خطأ كان موجودًا حتى مارس 2018 على الأقل.

الواجب المنزلي لجميع المبرمجين الذين يقرؤون هذا المنشور: فكر في كيفية العثور على مثل هذا الخطأ في تطبيقك؟ الشفرة ، يبدو أنها تعمل ، ولكنك لا تدرك حتى أنها معطلة بالفعل: أنت لا تشغل برنامجين بنفس الخطأ في نفس الوقت ، ستعرف فقط عن المشكلة عندما يبدأ المستخدمون في الشكوى.

كيف يمكن تغيير عملية التطوير لاكتشاف مثل هذه الأخطاء قبل الإصدار؟

All Articles