Kerumitan Tersembunyi C: Apabila Kelakuan Tidak Tertakrif Bertemu Kod Dunia Sebenar

Pasukan Editorial BigGo
Kerumitan Tersembunyi C: Apabila Kelakuan Tidak Tertakrif Bertemu Kod Dunia Sebenar

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:

  1. Standard vs Amalan : Banyak corak pengaturcaraan biasa yang berfungsi dengan baik dalam amalan secara teknikal adalah kelakuan tidak tertakrif mengikut standard C
  2. Evolusi Perkakasan : Walaupun C sering dipuji kerana dekat dengan perkakasan, ciri perkakasan moden dan mekanisme keselamatan menjadikan beberapa amalan C tradisional semakin bermasalah
  3. 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.