Bagaimana kesalahan dari 2009 menyebabkan konflik antara Docker untuk Windows dan Razer Synapse

Hari ini saya menemukan bug yang sangat menarik: Docker untuk Windows tidak akan mulai jika Anda menjalankan panel kontrol driver Razer Synapse.

Tapi yang paling menarik adalah mengapa itu terjadi ...



Kedua aplikasi ditulis sehingga Anda hanya dapat menjalankan satu instance pada satu waktu. Untuk melakukan ini, mereka membuat mutex global menggunakan .NET assembly sebagai kunci GUID, kan?

Tetapi sayangnya, mereka melakukan kesalahan, dan terlebih lagi, mereka juga salah. Kode kesalahan terlihat seperti ini:

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

Idenya adalah untuk mendapatkan GUID dari rakitan yang dapat dieksekusi dan membuat mutex berdasarkan itu yang akan mencegah lebih dari satu instance dari memulai.

Tapi itu pasti salah. Seharusnya tidak ada panggilan GetType().

Opsi ini tidak mengembalikan GUID dari rakitan tertentu, tetapi GUID dari tipe yang dibangun ke dalam .NET yang menggambarkan rakitan seperti itu - System.Reflection.RuntimeAssembly.

Oleh karena itu, ketika mereka membuat mutex, mereka tidak menggunakan GUID dari kode mereka sendiri, tetapi GUID dari .NET internal. Dan untuk kedua aplikasi, GUID ini akan sama.

Bagaimana ini bisa terjadi? Lucu, tapi kami tahu persis bagaimana caranya. Stackoverflow yang harus disalahkan!

Kembali pada tahun 2009, seorang pengguna dengan nama panggilan Nathan mengajukan pertanyaan - " bagaimana cara mendapatkan GUID perakitan dilakukan?". Setelah 12 menit, pengguna Cerebrus menjawabnya, tetapi ada kesalahan dalam jawabannya.

Setelah satu tahun dan sebulan, pengguna Yoopergeek menunjukkan kesalahan. Cerebrus kembali tiga tahun kemudian dan mengoreksi jawabannya - tetapi Anda tidak dapat menghapusnya karena jawabannya telah ditandai sebagai "diterima."

Dengan demikian, kesalahan dalam menjawab pertanyaan pada tahun 2009 menyebabkan bug yang ada setidaknya hingga Maret 2018.

Pekerjaan rumah untuk semua programmer yang membaca posting ini: pikirkan tentang bagaimana Anda akan menemukan bug seperti itu dalam aplikasi Anda? kode itu, tampaknya berfungsi, tetapi Anda bahkan tidak menyadari bahwa itu sebenarnya rusak: Anda tidak menjalankan dua program dengan kesalahan yang sama pada saat yang sama, Anda hanya akan tahu tentang masalah ketika pengguna mulai mengeluh.

Bagaimana proses pengembangan dapat diubah untuk mendeteksi kesalahan seperti itu sebelum dirilis?

All Articles