Legacy system programs developed in C have suffered from prevalent memory bugs. Migrating these systems to Rust is a promising way to enhance reliability, thanks to Rust’s strong safety guarantee. Due to the high cost of manual migration, automatic C-to-Rust translators are essential for enabling the migration of real-world systems. However, existing translators generate unsatisfactory code by relying on language features whose safety is not validated by the compiler and code patterns considered unidiomatic by Rust developers. To improve the quality of automatic translation, static analysis and code transformation can be employed to replace unsafe features and unidiomatic patterns with safe and idiomatic alternatives. This article discusses the research community’s efforts to address scalar pointers, locks, unions with tags, and output parameters, and introduces remaining unsafe features and unidiomatic patterns that future work should tackle. Furthermore, we explore the potential of using large language models for C-to-Rust translation.