crate bzip2 beralih ke implementasi 100% Rust alih-alih C
(trifectatech.org)- crate
bzip20.6.0 mengadopsilibbz2-rs-sys, implementasi Rust untuk algoritme bzip2, sebagai default untuk menghapus dependensi C sekaligus meningkatkan kecepatan dan kemudahan cross-compilation - bzip2 adalah algoritme lama yang kini lebih jarang digunakan, tetapi berbagai protokol dan library masih harus mendukungnya demi kepatuhan spesifikasi sehingga tetap bertahan jauh di dalam pohon dependensi
- Implementasi Rust menggunakan sekitar 9.66~14.87% lebih sedikit siklus CPU dibanding C saat kompresi, dan juga membaik 4.48~10.00% di seluruh pengujian dekompresi
- Dengan menghapus C, build WebAssembly, Windows, dan Android menjadi lebih sederhana, dan secara default tidak mengekspor simbol
libbz2-rs-syssehingga risiko konflik simbol dengan dependensi lain juga berkurang - Dalam audit, 1 bug logika off-by-one dan beberapa batasan fuzzer diperbaiki, dan library maupun aplikasi tingkat atas yang memakai
bzip2kini juga bisa dijalankan dengan MIRI
Perubahan implementasi default di bzip2 0.6.0
- crate
bzip20.6.0 kini menggunakanlibbz2-rs-sys, implementasi Rust dari algoritme bzip2, sebagai default - Dengan menghapus dependensi C yang lama, crate
bzip2menjadi lebih cepat dan lebih mudah untuk cross-compile - crate
libbz2-rs-sysjuga bisa dibangun sebagai library dinamis C agar proyek C pun dapat memanfaatkan peningkatan ini - bzip2 saat ini memang tidak banyak dipakai, tetapi banyak protokol dan library masih harus mendukungnya demi kepatuhan spesifikasi, dan karenanya tetap tertinggal jauh di dalam pohon dependensi berbagai proyek
- Detail implementasinya dapat dilihat pada tulisan sebelumnya Translating bzip2 with c2rust
Hasil peningkatan performa
- Implementasi Rust pada umumnya lebih cepat daripada implementasi C, dan dalam beberapa kasus performanya berada di tingkat yang mirip dengan C
- Sepanjang yang diketahui, tidak ada kasus yang benar-benar lebih lambat
- Dalam benchmark kompresi, siklus CPU berkurang dibanding C
sample3.reflevel 1:38.51M→33.53M, -14.87%silesia-small.tarlevel 1:3.43G→3.00G, -14.30%silesia-small.tarlevel 9:3.47G→3.17G, -9.66%levelpada bzip2 menunjukkan penggunaan memori kerja dan tidak banyak memengaruhi performasample3.refbahkan pada level 1 sudah mengalokasikan lebih banyak memori daripada ukuran file, sehingga level yang lebih tinggi kurang relevan
- Performa dekompresi juga membaik di seluruh pengujian
sample3.bz2: -4.48%sample1.bz2: -8.63%sample2.bz2: -7.67%dancing-color.ps.bz2: -5.17%re2-exhaustive.txt.bz2: -7.65%zip64support.tar.bz2: -10.00%
- Pada mesin benchmark macOS, angka performa dekompresi kadang terlihat lebih rendah
- Penyebabnya belum diketahui, dan di macOS sulit menjalankan alat seperti
perfuntuk mengotomatisasi pelacakan performa
- Penyebabnya belum diketahui, dan di macOS sulit menjalankan alat seperti
Build dan mitigasi konflik simbol
- Cross-compilation untuk proyek Rust yang memiliki dependensi C sering kali langsung berjalan berkat crate
cc, tetapi saat gagal, debug error-nya bisa sulit- Linking library sistem juga bisa menimbulkan masalah yang membingungkan dan sulit direproduksi
- Kompilasi bzip2 untuk WebAssembly sudah lama bermasalah
- Dengan menghapus dependensi C dan hanya memakai kode Rust, build WebAssembly, Windows, dan Android menjadi lebih mudah berjalan
libbz2-rs-syssecara default tidak mengekspor simbol- Saat memakai dependensi C, simbol perlu diekspor agar dapat ditemukan oleh blok Rust
extern - Nama yang diekspor bisa berbenturan jika dependensi lain mendeklarasikan simbol yang sama
- Jika proyek Rust memerlukan ekspor simbol, hal itu bisa diaktifkan lewat feature flag
- Saat memakai dependensi C, simbol perlu diekspor agar dapat ditemukan oleh blok Rust
Hasil verifikasi dan audit
- Implementasi bzip2 yang berperforma tinggi memerlukan sebagian kode unsafe, dan meniru antarmuka C ke Rust memerlukan lebih banyak kode unsafe
- Kode tersebut dapat dijalankan di MIRI
- Library atau aplikasi tingkat tinggi yang menggunakan
bzip2sekarang juga bisa dijalankan dengan MIRI
- Dalam audit ditemukan 1 bug logika off-by-one dan beberapa batasan fuzzer diperbaiki
- Selain itu tidak ada temuan penting lain
- Audit dilakukan oleh Radically Open Security, dan laporan lengkapnya tersedia di audit report PDF
- Pekerjaan ini mendapat bantuan dari maintainer crate
bzip2Alex Crichton, Radically Open Security yang menyediakan audit dan keahlian, serta NLnet Foundation yang mendanai melalui e-Commons Fund
Belum ada komentar.