- 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
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
Misalnya, kalau melihat https://github.com/Cpp2Rust/cpp2rust-testsuite/… , itu mungkin Rust yang aman, tetapi jelas sulit disebut Rust yang idiomatis
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?
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
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?