Как ошибка из 2009 вызывает конфликт Docker for Windows и Razer Synapse

Автор оригинала: Foone
  • Перевод
Сегодня мне попался весьма любопытный баг: Docker for Windows не запустится, если у вас запущена панель управления драйвером Razer Synapse.

Но интереснее всего то, почему так случилось…



Оба приложения написаны так, что можно одновременно запустить только один экземпляр. Для этого они создают глобальный мьютекс, используя в качестве ключа GUID сборки .NET, да?

Но увы, они делают это неправильно, и более того — одинаково неправильно. Ошибочный код выглядит примерно так:

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

Идея заключается в том, чтобы получить GUID исполняемой сборки и создать на его основе мьютекс, который не даст запустить больше одного экземпляра.

Но должно быть не так. Там не должно быть вызова GetType().

В этом варианте возвращается не GUID конкретной сборки, а GUID встроенного в .NET типа, который описывает сборки как таковые — System.Reflection.RuntimeAssembly.

Поэтому, когда они создают мьютексы, они используют не GUID из их собственного кода, а GUID из внутренностей .NET. И для обоих приложений этот GUID будет одинаковым.

Как же это случилось? Забавно, но мы в точности знаем, как. Всему виной Stackoverflow!

Еще в 2009 году пользователь c ником Nathan задал вопрос — "как получить GUID выполняемой сборки?". Через 12 минут ему ответил пользователь Cerebrus, но в его ответе была ошибка.

Спустя год и месяц, пользователь Yoopergeek указывает на ошибку. Cerebrus возвращается спустя еще три года и исправляет свой ответ — но удалить его уже нельзя, потому что ответ был помечен как «принятый».

Таким образом, ошибка в ответе на вопрос в 2009 году вызывала баг, просуществовавший как минимум до марта 2018.

Домашнее задание для всех программистов, читающих данный пост: подумайте, как бы вы обнаружили такой баг в своем приложении? Вы копипастите код, он вроде работает, но вы даже не догадываетесь, что на самом деле он сломан: вы же не запускаете две программы с одинаковой ошибкой одновременно. О проблеме вам станет известно, только когда пользователи начнут жаловаться.

Как можно было бы поменять процесс разработки, чтобы обнаруживать подобные ошибки до релиза?

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 17

    +3
    Удивляет как можно копипастить код и не разобраться что он делает…
      +3

      В сроки втиснулись, таски выполнили, деньги получили. За разбираться не доплатят

        0

        Всегда так делаю! :-)

        0

        Печально видеть StackOverflow-Driven Development. Когда ищете что-то на SO — не надо копипастить код из ответа. Лучше разобраться в нём и написать свой.

          +7
          не надо копипастить код из ответа

          …, а надо копипастить код из вопроса! )))
          +2
          Копипастить читая. Надо признать, что кроме вдумчивого чтения исходного кода, в моём арсенале нет практик или инструментов, способных выловить подобный баг до его воспроизведения.
            0
            Offtopick on
            Откровенно говоря Razer Synapse такое поделие что оторопь берет. После того, как Razer Synapse обновился и сломал мне видео-драйвер, я его удалил и опасаюсь устанавливать опять.
            Offtopic off
              0
              Ну как бы от китайской свистоперделки ничего другого и не ждешь.
              Но докер, Карл!
                0
                Года два назад у меня были случаи, что во время обновления Windows на до-загрузочном этапе, где даже еще курсора нет (а клавиатура не реагирует) внезапно запускалось это самое окно Razer Synapse, которое, судя по всему, пока не закроешь — прогресс обновления дальше не сдвинется (а закрыть — никак). Приходилось насильно перезагружаться и удалять Razer Synapse на время обновления…

                UPD:
                нашел фото в интернете:

                На фото присутствует курсор, в моем случае — то ли не было его, то ли клик не проходил — уже не помню


                0
                Я когда-то искал альтернативную версию софта (или альтернативный софт) для моей китаемыши, встретил Open Source драйвер для Razer мышей с поддержкой их фич. Возможно многих факт его существования тут заинтересует.
                0
                У меня давно и то и то стоит и все работает, поэтому стало интересно, а был ли мальчик. В результате расследования выяснилось, что он был, но исправлен еще 2 года назад. Автору оригинала надо чаще обновлять софт! (ну или он решил немного попиарить свой твиттер)

                P.S. если и копирую, со stack overflow, то только с пониманием как и почему он работает
                  0
                  Всё же правильнее вот както так:
                  string _appGuid =
                  ((GuidAttribute)
                  Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value;
                    0

                    На Stackoverflow по ссылке примерно так и написано.

                    –3
                    Меня одного интересует, зачем использовать докер на винде ?! Это мазохизм какой-то
                      +4

                      Почему нет?

                        +2

                        А что предлагаете использовать вместо него?

                          0
                          После серверов и драйверов на JS и ботов на PHP докер на винде уже не кажется чем-то таким неординарным. :)

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.