Сегодня я столкнулся с очень интересной ошибкой: Docker для Windows не запускается, если у вас запущена панель управления драйвером Razer Synapse. Но самое интересное, почему это произошло.
Оба приложения написаны таким образом, что одновременно может работать только один экземпляр.
Для этого они создают глобальный мьютекс, используя в качестве ключа GUID сборки .
NET, верно? Но, увы, они делают это неправильно, и причём одинаково неправильно.
Ошибочный код выглядит примерно так:
Идея состоит в том, чтобы получить GUID исполняемой сборки и создать на его основе мьютекс, который предотвратит запуск более чем одного экземпляра.string.Format("Global\{0}", (object) Assembly.GetExecutingAssembly().
GetType().
GUID);
Но так быть не должно.
Не должно быть звонка GetType()
.
Этот параметр возвращает не GUID конкретной сборки, а GUID встроенного типа .
NET, который описывает сборки как таковые.
System.Reflection.RuntimeAssembly
.
Поэтому, когда они создают мьютексы, они используют не GUID из своего собственного кода, а GUID из внутренних компонентов .
NET. И для обоих приложений этот GUID будет одинаковым.
Как это произошло? Забавно, но мы именно так мы знаем как.
Во всем виноват Stackoverflow! Еще в 2009 году пользователь с ником Nathan задал вопрос: " как получить GUID работающей сборки? Через 12 минут ему ответил пользователь Cerebrus, но в его ответе была ошибка.
Год и месяц спустя пользователь Yoopergeek указывает на ошибку.
Церебрус возвращается еще через три года и исправляет свой ответ, но удалить его уже нельзя, поскольку ответ помечен как «принятый».
Таким образом, ошибка при ответе на вопрос в 2009 году вызвала ошибку, существовавшую как минимум до марта 2018 года.
Домашнее задание для всех программистов, читающих этот пост: подумайте, как бы вы обнаружили такую ошибку в своем приложении? Копируешь код, он вроде работает, но даже не понимаешь, что он на самом деле сломан: ты же не запускаешь две программы с одной и той же ошибкой одновременно.
Вы узнаете о проблеме только тогда, когда пользователи начнут жаловаться.
Как можно изменить процесс разработки, чтобы выявить подобные ошибки перед выпуском? Теги: #программирование #.
NET #Ненормальное программирование #stackoverflow #ASP #ASP #bug #bug #copy-paste
-
Дублирование Законно И Выгодно Для Вас
19 Oct, 24 -
Мудрые Слова Веб-Дизайна
19 Oct, 24 -
Быстрый Доступ К 2D-Массиву Во Flash
19 Oct, 24 -
Новый Год - Встреча Вебмастеров Snyp 2010
19 Oct, 24