Mengapa Kod Asas C SQLite Menghadapi Scrutin dalam Era Rust

Pasukan Komuniti BigGo
Mengapa Kod Asas C SQLite Menghadapi Scrutin dalam Era Rust

Dalam dunia kejuruteraan perisian, hanya segelintir pustaka yang mencapai kepopularan dan kebolehpercayaan setanding SQLite. Enjin pangkalan data ringan ini, yang tertanam dalam segala-galanya daripada pelayar web sehingga sistem pesawat, telah dilaksanakan dalam C sejak penubuhannya pada tahun 2000. Apabila bahasa yang lebih baharu dan selamat memori seperti Rust mendapat populariti, pembangun mempersoalkan sama ada C masih merupakan pilihan yang tepat untuk perisian asas. Perbincangan ini mendedahkan perbezaan falsafah yang mendalam tentang kualiti perisian, metodologi pengujian, dan apa yang benar-benar menjadikan kod boleh dipercayai.

Kebergantungan Perpustakaan C Minimal SQLite:

  • memcmp(), memcpy(), memmove(), memset()
  • strcmp(), strlen(), strncmp()
  • malloc() dan free() (dalam binaan lengkap)
  • Operasi fail OS asas

Paradoks Pengujian: Ciri Keselamatan lwn. Liputan Cabang

Salah satu strategi kualiti paling tersendiri SQLite melibatkan pencapaian liputan ujian cabang 100% - memastikan setiap laluan pelaksanaan yang mungkin dalam kod mesin mereka diuji. Metodologi ini bercanggah secara langsung dengan cara bahasa selamat memori beroperasi. Rust dan bahasa yang serupa secara automatik memasukkan semakan batas yang mencipta cabangan yang, dalam kod yang betul, tidak sepatutnya dilaksanakan. Pembangun SQLite berhujah bahawa cabangan yang tidak boleh diuji ini melemahkan proses jaminan kualiti mereka.

Tindak balas komuniti terhadap hujah ini telah terbahagi dengan ketara. Sesetengah pembangun mendapatinya menarik, dengan mengakui bahawa pengujian yang menyeluruh adalah penting untuk sistem kritikal keselamatan. Yang lain melihatnya sebagai mengutamakan metrik ujian berbanding keselamatan sebenar. Seperti yang disebut oleh seorang pengulas, Ini terasa seperti mengejar liputan ujian 100% sewenang-wenangnya dengan mengorbankan keselamatan. Kualiti kod sebenarnya tidak bertambah baik dengan meninggalkan semakan walaupun ia meningkatkan liputan pengujian.

Perdebatan ini menyentuh soalan asas tentang kebolehpercayaan perisian. Adakah lebih baik untuk mempunyai kod yang diuji secara teliti yang mungkin mengandungi isu keselamatan memori, atau kod dengan semakan keselamatan automatik yang tidak boleh diuji sepenuhnya? Pendekatan SQLite mencerminkan falsafah mereka bahawa pengujian komprehensif mengatasi ciri keselamatan automatik untuk kes penggunaan khusus mereka.

Konundrum Kod Legasi: Tulis Semula lwn. Mengekalkan

Suit ujian besar-besaran SQLite dan penapisan selama beberapa dekad menghadirkan halangan yang hebat untuk menulis semula dalam sebarang bahasa baharu. Pustaka ini telah menjalani fuzzing dan pengujian yang meluas, dengan pasukan keselamatan Google mengenal pasti banyak CVE dalam tahun-tahun kebelakangan ini walaupun reputasi kebolehpercayaan SQLite. Ini termasuk isu kerosakan memori, aliran buffer, dan kerentanan penggunaan-selepas-bebas yang mungkin dicegah oleh bahasa selamat memori.

Namun, kos menulis semula kod asas yang telah diuji dalam pertempuran sedemikian membuatkan peminat Rust berfikir dua kali. Seperti yang diperhatikan oleh seorang pembangun, Jika ia diuji sepenuhnya seperti yang didakwa, maka pertukaran kepada Rust akan menjadi remeh. Apa yang anda perlukan hanyalah lulus suit ujian dan semua pepijat akan hilang. Realitinya lebih kompleks - penulisan semula selalunya memperkenalkan pepijat baharu sambil membetulkan yang lama, dan perbezaan tingkah laku yang halus boleh memecahkan aplikasi sedia ada.

Kemunculan projek seperti Turso, pangkalan data serasi SQLite yang ditulis dalam Rust, menunjukkan minat komuniti terhadap alternatif moden. Walau bagaimanapun, ini adalah pelaksanaan semula dari bawah ke atas dan bukannya port langsung, dan mereka menghadapi cabaran untuk menyamai pengoptimuman dan pengujian dunia sebenar SQLite selama beberapa dekad.

CVE SQLite Terkini (2021-2025):

  • Kelemahan rasuah memori
  • Limpahan penimbal
  • Isu penggunaan-selepas-bebas
  • Limpahan integer
  • Pelanggaran sempadan tatasusunan
  • Ralat kekeliruan jenis

Sakit Tumbuh Rust: Kematangan lwn. Inovasi

Pembangun SQLite telah menggariskan syarat khusus yang perlu dipenuhi Rust sebelum mereka mempertimbangkan penulisan semula. Ini termasuk menunjukkan kestabilan setanding dengan C, membuktikan ia boleh mencipta pustaka kegunaan am yang boleh dipanggil dari mana-mana bahasa, berfungsi pada sistem terbenam yang kurang dikenali tanpa sistem pengendalian, dan membangunkan alat untuk ujian liputan cabang 100%.

Penyokong Rust membalas bahawa banyak daripada keperluan ini telah dipenuhi. Rust telah wujud selama sepuluh tahun sejak keluaran 1.0, mengekalkan keserasian ke belakang, dan boleh menghasilkan pustaka dengan antara muka serasi C. Bahasa ini berfungsi pada sistem terbenam tanpa logam dan menawarkan mekanisme untuk memintas semakan batas di mana prestasi adalah kritikal.

Perbincangan ini menyerlahkan ketegangan antara inovasi dan kestabilan dalam penggunaan bahasa pengaturcaraan. Seperti yang dirumuskan oleh seorang pengulas, C akan kekal lama selepas Rust seterusnya berada di situlah wang saya. Dan walaupun Rust masih hadir, akan ada Rust baharu pada masa itu. Jadi mengapa menulis semula? Sentimen ini menangkap pendekatan konservatif yang mendominasi pembangunan perisian infrastruktur.

Prasyarat Penggunaan Rust mengikut Pasukan SQLite:

  • Menunjukkan kestabilan dan pengurangan kekerapan perubahan
  • Membuktikan kebolehoperasian perpustakaan tujuan umum
  • Sokongan untuk sistem terbenam yang jarang digunakan tanpa OS
  • Alat ujian liputan cawangan 100%
  • Pemulihan ralat OOM yang lancar
  • Pariti prestasi dengan pelaksanaan C

Realiti Praktikal: Apabila Cukup Baik Lebih Baik Daripada Sempurna

Walaupun terdapat kelebihan teori bahasa selamat memori, kejayaan berterusan SQLite dalam C menunjukkan bahawa pertimbangan praktikal selalunya mengatasi penyelesaian ideal. Kebergantungan minima pustaka ini, kebolehpasaran yang luar biasa, dan rekod prestasi yang terbukti membuatkan kes yang menarik untuk kekal dengan apa yang berkesan. Seperti yang diperhatikan secara pragmatik oleh seorang pembangun, SQLite boleh menjadi bahasa himpunan memandangkan kestabilan dan pengujian meluasnya.

Perbincangan komuniti mendedahkan bahawa untuk projek matang dan stabil dengan kadar perubahan yang rendah, faedah menulis semula berkurangan dengan ketara. Keuntungan keselamatan daripada keselamatan memori paling berharga dalam kod asas yang dibangunkan secara aktif, manakala kod legasi yang telah diuji dengan baik menghadirkan peluang yang lebih sedikit untuk isu keselamatan memori baharu muncul.

Jika anda mempunyai kod yang sangat sedikit atau langsung tidak berubah dan tiada isu besar, jangan tulis semula.

Nasihat pragmatik ini mencerminkan konsensus bahawa penulisan semula tidak sepatutnya menjadi pemikiran lalai, terutamanya untuk perisian asas yang sudah memenuhi sasaran kebolehpercayaannya melalui cara lain.

Melihat Ke Hadapan: Evolusi Tanpa Revolusi

Kisah SQLite menggambarkan bahawa pilihan bahasa pengaturcaraan melibatkan pertukaran yang melangkaui jauh daripada keupayaan teknikal. Kepakaran pasukan, metodologi pengujian, keperluan penyebaran, dan pendekatan falsafah terhadap kualiti perisian semua mempengaruhi keputusan ini. Walaupun Rust mewakili pencabar paling serius kepada dominasi C dalam pengaturcaraan sistem setakat ini, peralihan akan beransur-ansur dan bukannya revolusioner.

Untuk projek baharu, pengiraan mungkin berbeza dengan ketara. Seperti yang diperhatikan oleh seorang pengulas, SQLite menggunakan beberapa pengaturcara C terbaik... Dan kami masih mempunyai kerentanan memori. Bagaimana sesiapa masih berhujah untuk C untuk projek baharu? Perspektif ini mencadangkan bahawa walaupun kod asas C sedia ada mungkin kekal dalam C, pembangunan baharu semakin memihak kepada alternatif selamat memori.

Dialog berterusan antara komuniti C dan Rust memberi manfaat kepada kedua-dua bahasa, mendorong alat C untuk bertambah baik dan Rust untuk menangani keperluan dunia sebenar daripada projek-projek yang mantap. Apabila bahasa pengaturcaraan berkembang, pendebungan silang idea ini akhirnya mengukuhkan seluruh ekosistem perisian.

Rujukan: Why Is SQLite Coded In C