Cpp2Rust: 从C++到安全Rust的自动翻译
摘要
Cpp2Rust 是一个开源工具,利用 clang 的 AST 和一个运行时库,自动将 C++ 代码转换为安全的 Rust 代码,支持安全和 unsafe 两种输出模式,实现安全的内存安全转换。
查看缓存全文
缓存时间: 2026/07/10 06:05
Cpp2Rust/cpp2rust 源码:https://github.com/Cpp2Rust/cpp2rust
Cpp2Rust
Cpp2Rust 将 C++ 自动翻译为完全安全的 Rust。它是一个基于 clang AST 的语法驱动翻译器。
Cpp2Rust 的算法在论文《Cpp2Rust: Automatic Translation of C++ to Safe Rust》(https://web.ist.utl.pt/nuno.lopes/pubs/cpp2rust-pldi26.pdf)中进行了描述,该论文发表于 PLDI 2026。
概述
Cpp2Rust 首先使用 clang 解析输入的 C++ 文件并生成 AST。然后遍历 AST 并以字符串形式生成 Rust 代码,在必要时(例如原始指针语义)插入对 libcc2rs 运行时库的调用。最后,使用 rustfmt 将 Rust 代码格式化为一个单独的 .rs 文件。
默认情况下使用引用计数模型,该模型生成完全安全的 Rust。也可以通过 --model=unsafe 命令行参数生成不安全的 Rust,用于调试和性能比较。
运行时库(libcc2rs)
生成的代码依赖于一个旨在简化翻译过程的运行时库。C 指针被转换为 libcc2rs 提供的 Ptr 类型。Ptr 模拟了 C 指针的语义,包括空指针、指针运算和别名,同时通过运行时检查满足 Rust 的借用检查器。
依赖
在 Ubuntu 上,使用以下命令安装必要的依赖:
sudo apt install libclang-22-dev clang++-22 ninja-build cmake
curl -LsSf https://astral.sh/ruff/install.sh | sh
构建
mkdir build
cd build
cmake -GNinja ..
ninja
ninja check
运行
翻译单个文件
./build/cpp2rust/cpp2rust --file=<.cpp> -o=<.rs>
默认使用引用计数模型(输出完全安全的 Rust)。如需生成不安全的 Rust:
./build/cpp2rust/cpp2rust --file=<.cpp> -o=<.rs> --model=unsafe
最小示例。 给定 hello.cpp:
#include <cstdio>
int main() {
printf("hello world\n");
return 0;
}
运行 ./build/cpp2rust/cpp2rust --file=hello.cpp -o=hello.rs 生成:
pub fn main() {
std::process::exit(main_0());
}
fn main_0() -> i32 {
println!("hello world");
return 0;
}
编译并运行:
rustc hello.rs -L ../libcc2rs/target/debug
./hello
翻译整个程序
首先为您的项目生成一个 compile_commands.json(https://clang.llvm.org/docs/JSONCompilationDatabase.html)。使用 CMake 时,只需添加一个额外标志:
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
然后运行:
./build/cpp2rust/cpp2rust --dir=<目录> -o <输出目录>.rs
<目录> 必须包含 compile_commands.json 文件。
测试套件
# 运行所有测试
ninja check
# 仅运行单元测试
ninja check-unit
# 运行 libcc2rs 的单元测试
ninja check-libcc2rs
# 运行 libcc2rs-macros 的单元测试
ninja check-libcc2rs-macros
# 在有意修改后重新生成单元测试的预期输出
REPLACE_EXPECTED=1 ninja check-unit
相似文章
将OCaml运行时从C语言逐行翻译为Rust
该项目详细介绍了将OCaml运行时从C语言逐行翻译为Rust的过程,旨在提高安全性和性能。
crustc: 整个rustc编译器,已翻译成C语言
一个名为cilly的Rust到C编译器工具链已成功将整个rustc编译器翻译成4600万行C代码,生成了一个可以用GCC构建的功能性Rust编译器。该项目旨在通过生成可移植的C代码,使Rust能够在老旧/冷门硬件上运行。
我开发了 Rust 的 Cargo 的克隆版,但是针对 C++
CRow 是一个新的 C/C++ 开源构建系统和依赖管理器,模仿了 Rust 的 Cargo 的简单性。
我们如何(及为何)将生产环境的C++前端基础设施重写为Rust
NearlyFreeSpeech.NET 将其生产环境的C++前端基础设施(nfsncore)重写为Rust,该系统负责所有传入请求的路由、缓存和访问控制。迁移的动机是Rust的安全性保证、性能、生态系统优势以及老化的C++代码库的局限性。
将React编译器移植到Rust
一项将React编译器移植到Rust的计划,旨在提高性能并与Rust生态系统集成。