C2Rust : un outil pour traduire du code C en Rust

Par:
fredericmazue

ven, 21/06/2019 - 16:11

C2Rust est un outil pour vous aider à porter votre code C en Rust. C2Rust prend uniquement en charge du code C99 dont il commence par vérifier la conformité avec clang.

Ensuite C2Rust traduit, ou transpile, le code C en code Rust non sûr (unsafe). Le but de cette traduction est d'obtenir un code fonctionnellement identique soulignent les concepteurs de l'outil, et non de produire un code Rust sûr.

Cette opération nécessite une seconde étape : soit modifier le code Rust unsafe à la main, soit utiliser un outil de refactoring en cours de développement au sein du même projet.

C2Rust dispose d'un site officiel avec une démonstration de C2Rust. Par exemple ce code C :

void insertion_sort(int const n, int * const p) {

    for (int i = 1; i < n; i++) {
        int const tmp = p[i];
        int j = i;
        while (j > 0 && p[j-1] > tmp) {
                p[j] = p[j-1];
                j--;
        }

        p[j] = tmp;
    }
}

est ainsi traduit par la démonstration du site :

#![allow(dead_code,
         mutable_transmutes,
         non_camel_case_types,
         non_snake_case,
         non_upper_case_globals,
         unused_mut)]
#![feature(libc)]
extern crate libc;
#[no_mangle]
pub unsafe extern "C" fn insertion_sort(n: libc::c_int, p: *mut libc::c_int) {
    let mut i: libc::c_int = 1i32;
    while i < n {
        let tmp: libc::c_int = *p.offset(i as isize);
        let mut j: libc::c_int = i;
        while j > 0i32 && *p.offset((j - 1i32) as isize) > tmp {
            *p.offset(j as isize) = *p.offset((j - 1i32) as isize);
            j -= 1
        }
        *p.offset(j as isize) = tmp;
        i += 1
    };
}

Le site officiel propose aussi une documentation de C2Rust.

C2Rust est un logiciel libre sous licence BSD 3, disponible sur GitHub.