#重构 #c2rust #Rust

nightly app crusts-notxl

CRustS - 从不安全的C到更安全的Rust

1个不稳定版本

0.0.3 2023年5月19日

#554 in 编程语言

Apache-2.0

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