Cpp2Rust: 从C++到安全Rust的自动翻译

Lobsters Hottest 工具

摘要

Cpp2Rust 是一个开源工具,利用 clang 的 AST 和一个运行时库,自动将 C++ 代码转换为安全的 Rust 代码,支持安全和 unsafe 两种输出模式,实现安全的内存安全转换。

<p><a href="https://lobste.rs/s/xyotoa/cpp2rust_automatic_translation_c_safe">评论</a></p>
查看原文
查看缓存全文

缓存时间: 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

相似文章

crustc: 整个rustc编译器,已翻译成C语言

Lobsters Hottest

一个名为cilly的Rust到C编译器工具链已成功将整个rustc编译器翻译成4600万行C代码,生成了一个可以用GCC构建的功能性Rust编译器。该项目旨在通过生成可移植的C代码,使Rust能够在老旧/冷门硬件上运行。