1个不稳定版本
0.0.3 | 2023年5月19日 |
---|
#554 in 编程语言
22KB
289 行
CRustS - 将不安全的C代码转译为更安全的Rust
Michael Ling, Yijun Yu, Haitao Wu, Yuan Wang, James R. Cordy, Ahmed E. Hassan
Trustworthiness Software Engineering & Open Source Lab
Huawei Technologies, Inc.
作为C的安全替代品,Rust是一种用于编写系统软件的语言,它具有类型安全的编译器,可以检查其内存和并发安全性。为了便于现有项目从C到Rust的平稳过渡,并为C中现有功能的初始Rust重实现奠定坚实基础,拥有一个能够使用程序转换技术将程序从C转换为Rust的源到源转换器将非常有帮助。然而,现有的C到Rust转换工具集的缺点是,它们在很大程度上保留了C的不安全语义,同时用Rust语法重写它们。因此,结果Rust程序的安全性仍然主要依赖于程序员,而不是Rust编译器。为了获得更多安全性保证,在本演示中,我们提出了CRustS,这是一种系统性的源到源转换方法,通过放宽语义保持约束来增加代码通过Rust编译器安全检查的比例。我们的方法使用220个TXL源到源转换规则,其中198个严格保持语义,22个近似语义,从而减少不安全表达式的范围,并提供了更多安全重构的机会。我们的方法已在开源和商业项目中进行了评估。我们的解决方案在转换后显著提高了安全代码比例,函数级别的安全代码比例与惯用Rust项目的平均水平相当。
与Laertes[OOPSLA’21]相比,就其自身基准测试而言,CRustS获得的安全比更高。
安装
# install c2rust
if [ $(uname -s) == "Darwin" ]; then
git clone https://github.com/immunant/c2rust
cd c2rust
scripts/provision_mac.sh
cargo build --release
cp target/release/c2rust $HOME/.cargo/bin
cp target/release/c2rust-transpile $HOME/.cargo/bin
cp target/release/c2rust-analyze $HOME/.cargo/bin
cp target/release/c2rust-instrument $HOME/.cargo/bin
cd -
brew install bear
export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH
cargo install crusts
elif [ $(uname -s) == "Linux" ]; then
apt install llvm cmake clang libclang-dev bear -y
LLVM_LIB_DIR=/usr/lib/llvm-14/lib/ cargo install c2rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup override set nightly-2021-11-22-x86_64-unknown-linux-gnu
rustup component add rustfmt --toolchain nightly-2021-11-22-x86_64-unknown-linux-gnu
export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH
cargo install crusts
else
docker pull yijun/crusts
fi
使用方法
在存在Makefile
的文件夹中运行crusts
,使用
crusts [-v | -c2rust]
或
docker run -v $(pwd):/mnt -t yijun/crusts [-v | -c2rust]
因此,将从C代码生成Rust代码
src/*.rs -- contains transpiled and refactored Rust code from the C code;
Cargo.toml build.rs lib.rs -- contains the `cargo build` configurations;
选项
-
-v
-- 版本信息 -
-c2rust
-- 只运行c2rust -
-h
-- 显示帮助 -
-txl
-- 实现自定义txl规则
参考文献
- Michael Ling,Yijun Yu,Haitao Wu,Yuan Wang,James Cordy,Ahmed Hassan. "In Rust We Trust: A transpiler from Unsafe C to Safer Rust", In: Proceedings of ICSE, 2022.
- 梅赫梅特·埃梅雷,瑞安·施罗德,凯尔·德威,本·哈德科普夫。2021年。将C语言翻译为更安全的Rust。ACM程序语言学报第5卷,OOPSLA,文章121(2021年10月),29页。(代码)
- TXL
- C2Rust
更新
- 与Laertes比较
- 为Windows用户集成Docker
- 添加一个开关
-c2rust
以关闭重构 - 添加一个开关
-v
以显示版本信息 - 添加一个开关
-h
以显示帮助 - 添加一个开关
-txl
以实现自定义的txl规则 - 错误修复:解引用指针,参见
test_unsafe
- 错误修复:printf模式,参见
test_stdio
依赖项
~13–28MB
~454K SLoC