The hard part is taking that unsafe C/Rust and turning it into checked/safe code. For this part, Rust has many benefits over C:
- As a language it is easier to refactor. This is due to a more hygenic macro system, a lack of header files, etc.
- The safe subset of Rust is much larger and more expressive than the subset of checked C. This provides more options for the unsafe -> safe translation effort.
- The safe subset of Rust is more powerful than the subset of checked C. This means that it's more likely that a piece of code can be translated 1:1 into safe Rust, compared to a more complex transformation. For example, code which returns a pointer into one of its arguments is not uncommon in C, and this can be directly translated into Rust lifetime annotations.