Como o erro de 2009 causa um conflito entre o Docker for Windows e o Razer Synapse

Hoje me deparei com um bug muito interessante: o Docker para Windows não será iniciado se o painel de controle do driver Razer Synapse estiver em execução.

Mas o mais interessante é por que isso aconteceu ...



Ambos os aplicativos são gravados para que você possa executar apenas uma instância por vez. Para fazer isso, eles criam um mutex global usando o assembly .NET como a chave GUID, certo?

Mas, infelizmente, eles estão fazendo errado e, além disso, estão igualmente errados. O código de erro é mais ou menos assim:

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

A idéia é obter o GUID do assembly executável e criar um mutex com base nele que impedirá o início de mais de uma instância.

Mas deve estar errado. Não deve haver uma ligação GetType().

Esta opção não retorna o GUID de um assembly específico, mas o GUID de um tipo incorporado ao .NET que descreve os assemblies como tais - System.Reflection.RuntimeAssembly.

Portanto, quando eles criam mutexes, eles não usam GUIDs de seu próprio código, mas GUIDs de .NET internos. E para os dois aplicativos, esse GUID será o mesmo.

Como isso aconteceu? Engraçado, mas sabemos exatamente como. Stackoverflow é o culpado!

Em 2009, um usuário com o apelido Nathan fez a pergunta - " como obter o GUID da montagem que está sendo executada?". Após 12 minutos, o usuário Cerebrus respondeu, mas houve um erro em sua resposta.

Após um ano e um mês, o usuário Yoopergeek indica um erro. Cerebrus retorna mais três anos depois e corrige sua resposta - mas você não pode excluí-lo porque a resposta foi marcada como "aceito".

Portanto, o erro em responder à pergunta em 2009 causou um erro que existia pelo menos até março de 2018.

Lição de casa para todos os programadores que lêem este post: pense em como você encontraria esse erro em seu aplicativo? o código parece funcionar, mas você nem percebe que ele está realmente quebrado: você não executa dois programas com o mesmo erro ao mesmo tempo, só saberá do problema quando os usuários começarem a reclamar.

Como o processo de desenvolvimento pode ser alterado para detectar esses erros antes do lançamento?

All Articles