Perbincangan terkini mengenai isu keserasian curl dengan UndefinedBehaviorSanitizer (UBsan) Clang telah mencetuskan perdebatan hangat dalam komuniti pembangun mengenai kelakuan tidak tertakrif C dan kesannya terhadap aplikasi dunia sebenar. Insiden ini menyoroti ketegangan yang semakin meningkat antara spesifikasi bahasa teori dan amalan pengaturcaraan praktikal yang telah diguna pakai selama berdekad.
Insiden
Pencetus perbincangan ini adalah perubahan terkini dalam kod sumber curl, di mana Daniel Haxx terpaksa mengubah cara jenis CURL ditakrifkan kerana UBsan menandakan ketidakpadanan jenis penuding fungsi sebagai kelakuan tidak tertakrif. Apa yang kelihatan seperti corak pelaksanaan yang munasabah - menggunakan definisi jenis berbeza untuk kod dalaman dan luaran - ternyata secara teknikal tidak betul mengikut standard C.
Memahami Isu Teknikal
Masalah utama berkisar tentang keserasian penuding fungsi dan penukaran jenis. Walaupun ramai pengaturcara C menganggap bahawa jenis penuding berbeza (seperti void*
dan char*
) boleh saling ditukar dengan bebas, standard C sebenarnya menganggap memanggil fungsi melalui penuding jenis berbeza sebagai kelakuan tidak tertakrif.
Implikasi Platform
Beberapa pembangun dalam komuniti telah menunjukkan bahawa ini bukan sekadar kebimbangan teori:
- Pengesahan Penuding : Platform moden dengan pengesahan penuding mungkin mengekod jenis fungsi ke dalam penuding itu sendiri
- Seni Bina CHERI : Sistem yang melaksanakan CHERI boleh menguatkuasakan pemeriksaan jenis penuding yang ketat
- Emscripten : Platform ini secara jelas gagal apabila menggunakan penukaran penuding fungsi yang tidak serasi
Konteks Yang Lebih Luas
Situasi ini menggambarkan perdebatan yang lebih besar dalam komuniti pengaturcaraan C:
- Standard vs Amalan : Banyak corak pengaturcaraan biasa yang berfungsi dengan baik dalam amalan secara teknikal adalah kelakuan tidak tertakrif mengikut standard C
- Evolusi Perkakasan : Walaupun C sering dipuji kerana dekat dengan perkakasan, ciri perkakasan moden dan mekanisme keselamatan menjadikan beberapa amalan C tradisional semakin bermasalah
- Pengoptimuman Pengompil : Kod yang dahulunya dianggap selamat dan boleh dipercayai mungkin gagal apabila pengoptimuman pengompil menjadi lebih agresif dalam mengeksploitasi kelakuan tidak tertakrif
Melangkah Ke Hadapan
Komuniti telah mencadangkan beberapa penyelesaian yang berpotensi:
- Menggunakan fungsi trampolin untuk mengendalikan penukaran jenis dengan selamat
- Menambah kategori baru definisi kelakuan kepada standard C
- Melaksanakan pemeriksaan khusus platform dengan bendera pengompil
Kesan Kepada Pembangun
Insiden ini menjadi peringatan bahawa pembangun berpengalaman juga perlu berhati-hati dengan andaian mengenai kelakuan C. Seperti yang dinyatakan oleh beberapa ahli komuniti, alat seperti UBsan menjadi semakin penting untuk mengenal pasti masalah yang berpotensi sebelum ia menyebabkan masalah dalam pengeluaran.
Perbincangan ini juga telah menyoroti keperluan yang semakin meningkat untuk bahasa pengaturcaraan moden yang boleh menyediakan kedua-dua kawalan tahap rendah dan jaminan keselamatan yang kukuh, dengan ramai yang menunjuk kepada Rust sebagai contoh bagaimana untuk mencapai keseimbangan ini.
Penyelesaian Daniel Haxx untuk curl menunjukkan kompromi praktikal, kembali kepada definisi jenis yang lebih mudah untuk memastikan keserasian merentasi platform sambil mengorbankan beberapa kejelasan kod dalaman.
Situasi ini terus berkembang sementara komuniti C bergulat dengan mengimbangi keserasian ke belakang, keselamatan, dan keupayaan perkakasan moden.