3 poin oleh GN⁺ 2025-06-19 | Belum ada komentar. | Bagikan ke WhatsApp
  • crate bzip2 0.6.0 mengadopsi libbz2-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-sys sehingga 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 bzip2 kini juga bisa dijalankan dengan MIRI

Perubahan implementasi default di bzip2 0.6.0

  • crate bzip2 0.6.0 kini menggunakan libbz2-rs-sys, implementasi Rust dari algoritme bzip2, sebagai default
  • Dengan menghapus dependensi C yang lama, crate bzip2 menjadi lebih cepat dan lebih mudah untuk cross-compile
  • crate libbz2-rs-sys juga 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.ref level 1: 38.51M33.53M, -14.87%
    • silesia-small.tar level 1: 3.43G3.00G, -14.30%
    • silesia-small.tar level 9: 3.47G3.17G, -9.66%
    • level pada bzip2 menunjukkan penggunaan memori kerja dan tidak banyak memengaruhi performa
    • sample3.ref bahkan 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 perf untuk mengotomatisasi pelacakan performa

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-sys secara 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

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 bzip2 sekarang juga bisa dijalankan dengan MIRI
  • Dalam audit ditemukan 1 bug logika off-by-one dan beberapa batasan fuzzer diperbaiki
  • Pekerjaan ini mendapat bantuan dari maintainer crate bzip2 Alex Crichton, Radically Open Security yang menyediakan audit dan keahlian, serta NLnet Foundation yang mendanai melalui e-Commons Fund

Belum ada komentar.

Belum ada komentar.