# Additional toolings for rust rust_hero is a rust assistant that utilizes NLP to enhance the quality of rust code. It supports `unsafe` and `lifetime` (todo) prediction. ```toml [dependencies] rust_hero = "0.5" ``` # Classify unsafe Rust code For each function in Rust, the `unsafe` keyword utilizes the unsafe superpowers. However, the `unsafe` keyword is not necessary if it can be taken out while the program is compiled successfully. `rust_hero` infers the necessity of `unsafe` keywords without the need of recompiling. `rust_hero` trains a [microsoft/codebert](https://github.com/microsoft/CodeBERT) based model and take advantage of bert's strong reasoning capability to inference the necessity of `unsafe`. ### Declaration Implementation of the language query in this project is based on [BrianHicks/tree-grepper](https://github.com/BrianHicks/tree-grepper). ## Performance It costs 2.06s and 2.90s on average for `rust_hero` inferencing one rust file on Intel I7-12700K CPU and NVIDIA 3080 12GB GPU, seperately. `rust_hero` written in Rust achieves up to 6.58X and 13.04X performance speedup over `rust_hero` written in Python language for GPU and CPU, seperately. ![Inference speedup](./Img/speedup.png)
Inference speedup of rust_hero in Rust over rust_hero in Python
## Installation ### Runtime dependencies for rust_hero ```bash sudo apt install build-essential cmake pkg-config libssl-dev wget zip git ``` Download the `tree-grepper` vendor (`cargo build` also download the vendor automatically): ```bash bash ./scripts/runtime.sh ``` It uses `libtorch-1.12.0` (See [rust-bert](https://github.com/guillaume-be/rust-bert)) to inference rust_hero. Download the libtorch with CPU or CUDA from following links: ```bash CPU: https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.12.0%2Bcpu.zip CUDA: https://download.pytorch.org/libtorch/cu116/libtorch-cxx11-abi-shared-with-deps-1.12.0%2Bcu116.zip ``` Unzip the file and set the environment path in .bashrc: ```bash export LIBTORCH=$libtorchDir$/libtorch export LD_LIBRARY_PATH=${LIBTORCH}/lib:$LD_LIBRARY_PATH source .bashrc ``` or in 'envConfig' of work directory: ```bash export LIBTORCH=$libtorchDir$/libtorch export LD_LIBRARY_PATH=${LIBTORCH}/lib:$LD_LIBRARY_PATH source envConfig ``` ## Prepare rust data for rust_hero test (optional): 50 rust files for testing is elaboratly selected from open-source rust project including on `rust-openssl`, `tokio`, `anyhow`, `hyper`, `rand`, `regex` and `rayon`: ```bash bash ./scripts/prepare_data.sh ``` ## Example usage for rust_hero: ```bash cargo run data/error.rs ``` `rust_hero` also supports classifling all rust files of one directory: ```bash cargo run data/ ```