Sebuah catatan blog baru-baru ini telah mencetuskan perbincangan sengit dalam komuniti pengaturcaraan mengenai isu keselamatan yang berpotensi dalam reka bentuk antara muka I/O baharu Zig . Kontroversi ini berpusat pada bagaimana abstraksi *std.lo.Reader
dan Writer
Zig mengendalikan saiz buffer, yang membawa kepada situasi di mana tingkah laku kod menjadi tidak dapat diramal atau gagal sepenuhnya.
Masalah Teras dengan Kebergantungan Buffer
Isu ini timbul apabila cuba menulis fungsi generik yang berfungsi dengan abstraksi I/O Zig . Apabila pembangun mencipta fungsi untuk membaca data dan menulisnya ke stdout, mereka mesti menentukan saiz buffer tanpa mengetahui apa yang sebenarnya diperlukan oleh pembaca atau penulis yang mendasari. Ini mewujudkan masalah asas: pembaca dan penulis yang berbeza boleh mempunyai keperluan saiz buffer khusus yang tidak kelihatan dalam tandatangan jenis mereka.
Masalah ini menjadi sangat jelas dengan perpustakaan pemampatan. Apabila menggunakan penyahmampatan zstd Zig dengan buffer yang terlalu kecil (seperti 64 bait), kod tersebut gagal dengan pernyataan dalam mod nyahpepijat dan memasuki gelung tak terhingga dalam mod keluaran. Yang lebih membimbangkan, kegagalan boleh bergantung kepada data input, menjadikannya sangat sukar untuk dikesan semasa ujian.
Manifestasi Masalah:
- Buffer kecil (64 bait): Kegagalan assertion dalam mod nyahpepijat, gelung tak terhingga dalam mod keluaran
- Buffer yang lebih besar: Berfungsi dengan betul
- Kegagalan boleh bergantung kepada data input, menjadikannya sukar untuk dikesan semasa ujian
Perdebatan Komuniti: Pepijat atau Kecacatan Reka Bentuk?
Komuniti pengaturcaraan berpecah sama ada ini mewakili isu reka bentuk asas atau hanya pepijat pelaksanaan. Sesetengah pembangun berhujah bahawa ini hanyalah pepijat dalam pelaksanaan pembaca tertentu dan bukannya masalah sistemik dengan antara muka Writer . Mereka mencadangkan bahawa pembaca tidak sepatutnya bergantung pada saiz buffer penulis yang dihantar ke pelaksanaan aliran mereka, dan jika mereka memerlukan keperluan khusus, mereka sepatutnya mengembalikan ralat yang betul dan bukannya menyebabkan gelung tak terhingga.
Walau bagaimanapun, yang lain menunjukkan bahawa reka bentuk API itu sendiri menggalakkan pelaksanaan yang bergantung pada saiz buffer. Ini menimbulkan persoalan tentang bagaimana pembaca penyahmampatan sepatutnya dilaksanakan dengan betul - patutkah mereka menguruskan buffer bersaiz terjamin mereka sendiri, dan jika ya, bagaimana mereka sepatutnya memperuntukkan memori tersebut?
Butiran Teknikal:
- Isu berlaku dengan abstraksi
*std.lo.Reader
danWriter
- Masalah khusus ditunjukkan dengan
std.compress.zstd.Decompress
- Keperluan saiz penimbal adalah tersirat dan tidak kelihatan dalam tandatangan jenis
- Fungsi generik tidak dapat menentukan saiz penimbal yang diperlukan pada masa kompilasi
Cabaran Dokumentasi
Walaupun sesetengah pihak berhujah ini adalah masalah dokumentasi semata-mata, pengkritik berpendapat bahawa dokumentasi sahaja tidak dapat menyelesaikan isu yang mendasari. Dalam senario dunia sebenar, sifat pembaca mungkin tidak diketahui atau sukar untuk ditentukan. Sebagai contoh, jenis pembaca boleh bergantung kepada pengepala respons HTTP, atau pembangun perpustakaan mungkin menerima pembaca sebagai input sambil mempersembahkan pembaca mereka sendiri sebagai output - menjadikannya tidak jelas keperluan buffer apa yang sepatutnya didokumentasikan.
Ini kelihatan hampir mustahil - seperti, saya mesti melakukan sesuatu yang salah. Dan jika saya, saya minta maaf. Tetapi, jika saya tidak, ini adalah masalah bukan?
Implikasi yang Lebih Luas untuk Falsafah Reka Bentuk Zig
Kontroversi ini menyentuh persoalan yang lebih besar mengenai pendekatan Zig terhadap keselamatan dan kejelasan. Walaupun Zig bertujuan untuk mengelakkan aliran kawalan tersembunyi dan menjadikan segala-galanya jelas, keperluan saiz buffer mewujudkan kebergantungan tersirat yang boleh membawa kepada kegagalan masa jalan. Perbincangan ini juga telah menyerlahkan ketegangan antara pendekatan berbeza untuk pengaturcaraan sistem, dengan sesetengah pembangun memihak kepada pengurusan memori manual yang jelas Zig manakala yang lain lebih suka jaminan keselamatan masa kompilasi Rust .
Perdebatan ini melangkaui butiran teknikal kepada dinamik komuniti, dengan beberapa kritikan ditujukan kepada bagaimana maklum balas diterima dan diproses. Pengarang blog asal telah menulis secara meluas tentang Zig pada masa lalu, termasuk kandungan pendidikan yang membantu, menjadikan respons yang menolak terhadap kritikan khusus ini lebih ketara.
Memandang ke Hadapan
Isu ini mewakili titik keputusan kritikal untuk reka bentuk antara muka I/O Zig . Pasukan pembangunan mesti memutuskan sama ada untuk menganggap ini sebagai pepijat pelaksanaan yang perlu diperbaiki atau sebagai masalah reka bentuk asas yang memerlukan perubahan seni bina. Penyelesaian ini berkemungkinan akan mempengaruhi bagaimana pembangun melihat komitmen Zig terhadap keselamatan dan kebolehramalan dalam pengaturcaraan sistem.
Kontroversi ini juga menyerlahkan cabaran yang dihadapi oleh mana-mana bahasa pengaturcaraan sistem baharu yang cuba mengimbangi prestasi, keselamatan, dan kebolehgunaan sambil membina komuniti yang mengalu-alukan di sekitar kritikan teknikal yang membina.
Rujukan: Is Zig's New Writer Unsafe?