2个版本
0.0.3 | 2023年5月19日 |
---|---|
0.0.2 | 2023年5月19日 |
#333 in 编程语言
每月21次下载
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规则
参考文献
- 李明,余一君,吴海涛,王媛,詹姆斯·科尔迪,艾哈迈德·哈桑。"在Rust中我们信任:从不安全C到更安全Rust的转换器",载于ICSE会议论文集,2022年。
- 梅赫梅特·艾姆雷,瑞安·施罗德,凯尔·德威,本·哈德科普夫。2021年。将C转换为更安全的Rust。ACM程序语言会议论文集,OOPSLA卷,第121篇文章(2021年10月),29页。(代码)
- TXL
- C2Rust
更新
- 与Laertes进行比较
- 集成Docker以支持Windows用户
- 添加开关
-c2rust
以关闭重构 - 添加开关
-v
以显示版本号 - 添加开关
-h
以显示帮助信息 - 添加开关
-txl
以实现自定义txl规则 - 修复错误:解引用指针,请参阅
test_unsafe
- 修复错误:printf模式,请参阅
test_stdio
依赖项
~13–28MB
~455K SLoC