1 poin oleh GN⁺ 3 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Cpp2Rust adalah penerjemah berbasis sintaks yang didasarkan pada AST clang, yang secara otomatis mengubah input C++ menjadi kode Rust yang sepenuhnya aman
  • Proses terjemahannya mem-parsing file C++ dengan clang untuk membuat AST, menelusuri AST sambil menghasilkan kode Rust sebagai string, lalu mengeluarkan satu file .rs dengan rustfmt
  • Nilai defaultnya adalah model reference counting, dan untuk debugging serta perbandingan performa, pembuatan unsafe Rust juga dimungkinkan dengan --model=unsafe
  • Kode yang dihasilkan bergantung pada pustaka runtime libcc2rs, dan pointer C diubah menjadi Ptr<T> yang memodelkan null, aritmetika, dan aliasing
  • Untuk menerjemahkan seluruh program diperlukan compile_commands.json, dan proyek CMake dapat membuatnya dengan flag CMAKE_EXPORT_COMPILE_COMMANDS=ON

Konversi otomatis dari C++ ke Rust aman

  • Cpp2Rust adalah alat yang secara otomatis menerjemahkan C++ ke Rust yang sepenuhnya aman
  • Ini adalah penerjemah berbasis sintaks yang didasarkan pada AST milik clang
  • Algoritme terjemahannya dijelaskan dalam makalah PLDI 2026, Cpp2Rust: Automatic Translation of C++ to Safe Rust

Pipeline penerjemahan

  • File C++ input terlebih dahulu di-parse dengan clang untuk membuat AST
  • Setelah itu AST ditelusuri sambil mengeluarkan kode Rust sebagai string
  • Jika diperlukan, panggilan ke pustaka runtime libcc2rs disisipkan
    • Contohnya adalah penanganan raw pointer semantics
  • Terakhir, rustfmt digunakan untuk merapikan kode Rust menjadi satu file .rs

Model Rust aman dan unsafe Rust

  • Perilaku default menggunakan model reference counting dan menghasilkan output Rust yang sepenuhnya aman
  • Generator unsafe Rust juga disediakan
    • Argumen command line-nya adalah --model=unsafe
    • Tujuannya untuk debugging dan perbandingan performa

Pustaka runtime libcc2rs

  • Kode yang dihasilkan bergantung pada pustaka runtime yang dirancang untuk menyederhanakan proses penerjemahan
  • Pointer C diubah menjadi tipe Ptr<T> yang disediakan oleh libcc2rs
  • Ptr<T> memodelkan semantik pointer C
    • null
    • aritmetika pointer
    • aliasing
  • Borrow checker Rust dipenuhi melalui operasi runtime yang diperiksa

Alur build dan eksekusi

  • Contoh pemasangan dependensi Ubuntu mencakup libclang-22-dev, clang++-22, ninja-build, cmake, ruff
  • Build dilakukan dengan urutan cmake -GNinja .., ninja, ninja check
  • Perintah terjemahan satu file berbentuk seperti berikut
./build/cpp2rust/cpp2rust --file=<file>.cpp -o=<file>.rs
  • Untuk menghasilkan unsafe Rust, jalankan seperti berikut
./build/cpp2rust/cpp2rust --file=<file>.cpp -o=<file>.rs --model=unsafe

Contoh minimal dan penerjemahan seluruh program

  • Contoh printf("hello world\n") pada hello.cpp diubah menjadi kode yang mencakup println!("hello world") di Rust
  • hello.rs hasil konversi dikompilasi dan dijalankan seperti berikut
rustc hello.rs -L ../libcc2rs/target/debug
./hello
  • Untuk menerjemahkan seluruh program diperlukan compile_commands.json
  • Di CMake, compile_commands.json dibuat dengan flag berikut
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
  • Perintah penerjemahan seluruh program berbentuk seperti berikut
./build/cpp2rust/cpp2rust --dir=<dir> -o <output>.rs
  • <dir> harus merupakan direktori yang berisi compile_commands.json

Perintah pengujian

  • Semua pengujian dijalankan dengan ninja check
  • Unit test dijalankan dengan ninja check-unit
  • Unit test libcc2rs dijalankan dengan ninja check-libcc2rs
  • Unit test libcc2rs-macros dijalankan dengan ninja check-libcc2rs-macros
  • Untuk sengaja membuat perubahan lalu menghasilkan ulang output yang diharapkan, gunakan REPLACE_EXPECTED=1 ninja check-unit

1 komentar

 
GN⁺ 3 jam lalu
Komentar di Lobste.rs
  • Pada Februari tahun ini saya mendengar presentasi Dan Wallach, yang memperkenalkan proyek TRACTOR(Translating All C to Rust) dari DARPA [1] [2] [3]
    Katanya pengujian dan evaluasi program riset ini sedang dilakukan oleh tim MIT Lincoln Laboratory
    Sepengetahuan saya masih dalam tahap riset, tetapi saya sangat tertarik pada topik ini, dan cukup penasaran bagaimana alat dan ide seperti ini akan muncul
    Rasanya ini benar-benar bisa menghilangkan banyak bug “sepele” yang berasal dari manajemen memori
    [1] https://www.darpa.mil/research/programs/translating-all-c-to-rust
    [2] https://github.com/DARPA-TRACTOR-Program
    [3] https://ll.mit.edu/r-d/projects/…

  • Menarik. Akan sangat bagus kalau bisa melihat satu-dua demo library atau aplikasi yang dikonversi oleh para penulis dengan alat ini dan yang menurut mereka sendiri menarik

  • Saya kurang paham mengapa tahap konversi diperlukan. Kalau ada cukup informasi untuk mengubahnya menjadi Rust yang memory-safe, bukankah berarti ada cukup informasi juga untuk menjamin C++-nya aman lewat analisis statis?

    • Karena proses konversinya memasukkan pemeriksaan baru, ini lebih seperti kompromi bahwa “kode baru akan gagal keras dan berhenti alih-alih merusak memori”, bukan “kode aslinya memang aman”
    • Hal ini ada di bagian awal paper yang ditautkan di README
      Sekitar 70% kerentanan keamanan pada perangkat lunak yang tersebar luas berasal dari bug memory safety di bahasa seperti C dan C++, dan meskipun sudah puluhan tahun berinvestasi pada mitigasi seperti analisis statis, sanitizer, dan isolasi hardware, penyerang masih mengeksploitasi operasi memori yang tidak aman
      Dijelaskan bahwa solusi jangka panjang yang menjanjikan adalah memindahkan codebase C++ yang ada ke bahasa yang memory-safe seperti Rust, tetapi melakukannya secara manual terlalu mahal dan rawan kesalahan
      Cpp2Rust mengklaim sebagai sistem pertama yang dapat secara otomatis mengonversi program C++ menjadi kode Rust yang secara fungsional setara dan memory-safe
      Dengan menukar sebagian performa dengan keamanan, sistem ini mengatasi ketidakcocokan mendasar antara referensi aliasing tanpa batas di C++ dan model ownership Rust melalui penyisipan pemeriksaan ownership dan mutability saat runtime, sehingga menjamin keamanan sambil mempertahankan semantik
      Untuk mengurangi overhead pemeriksaan dinamis, mereka juga membuat optimisasi antar-sumber untuk kode Rust, dan katanya menghilangkan operasi ownership yang redundan sehingga memulihkan sebagian besar performa yang hilang
      Jadi motivasinya bukan sekadar membuktikan keamanan, melainkan mem-porting ke Rust dan mempermudah pemindahan pengembangan ke Rust ke depannya
    • Tidak ada cukup informasi, dan menurut teorema Rice, ke depannya pun tidak akan ada
      Ide proyek seperti ini adalah membuat titik awal untuk refactoring lebih lanjut ke Rust yang idiomatis, dan dengan begitu kode dapat dibuat bisa dianalisis
      Harapannya, pemeriksaan runtime atau bagian yang tidak aman juga bisa dihapus dari kode hasil konversi
      Bisa saja orang bertanya, bukankah C++ cukup di-refactor menjadi “berbentuk Rust” agar sama-sama bisa dianalisis, tetapi C++ punya semantik berbeda yang memungkinkan lebih banyak fleksibilitas, sehingga jalur yang harus dianalisis bisa bertambah secara eksponensial atau analisis statis bisa terjebak di jalan buntu yang ambigu
      Kita harus berjanji tidak melakukan hal-hal yang menyulitkan penganalisis statis dan tidak mengeksploitasi kasus batas; untuk itu bisa dibuat dialek C++ dengan semantik yang lebih terbatas dan anotasi tambahan
      Circle/Safe C++ sudah menunjukkan kemungkinan itu, tetapi C++ WG menolaknya dengan kuat, jadi pilihan yang tersisa adalah menulis sendiri dialek C++ mirip Rust yang tidak didukung, atau cukup memakai Rust
  • Kalau kode inputnya sendiri tidak aman, tepatnya apa yang terjadi?

    • Ditangani dengan pemeriksaan runtime. Jadi saat pelanggaran terjadi, alih-alih merusak memori, program bisa crash secara aman dan deterministik