Translating C code into safe Rust is an effective way to ensure its memory safety. Compared to rule-based translation which produces Rust code that remains largely unsafe, LLM-based methods can generate more idiomatic and safer Rust code because LLMs have been trained on vast amount of human-written idiomatic code. Although promising, existing LLM-based methods still struggle with project-level C-to-Rust translation. They typically partition a C project into smaller units (\eg{} functions) based on call graphs and translate them bottom-up to resolve program dependencies. However, this bottom-up, unit-by-unit paradigm often fails to translate pointers due to the lack of a global perspective on their usage. To address this problem, we propose a novel C-Rust Pointer Knowledge Graph (KG) that enriches a code-dependency graph with two types of pointer semantics: (i) pointer-usage information which record global behaviors such as points-to flows and map lower-level struct usage to higher-level units; and (ii) Rust-oriented annotations which encode ownership, mutability, nullability, and lifetime. Synthesizing the \kg{} with LLMs, we further propose \ourtool{}, which implements a project-level C-to-Rust translation technique. In \ourtool{}, the \kg{} provides LLMs with comprehensive pointer semantics from a global perspective, thus guiding LLMs towards generating safe and idiomatic Rust code from a given C project. Our experiments show that \ourtool{} reduces unsafe usages in translated Rust by 99.9\% compared to both rule-based translation and traditional LLM-based rewriting, while achieving an average 29.3\% higher functional correctness than those fuzzing-enhanced LLM methods.
- ID del Artículo: 2510.10956
- Título: Project-Level C-to-Rust Translation via Synergistic Integration of Knowledge Graphs and Large Language Models
- Autores: Zhiqiang Yuan, Wenjun Mao, Zhuo Chen, Xiyue Shang, Chong Wang, Yiling Lou, Xin Peng
- Clasificación: cs.SE (Ingeniería de Software), cs.AI (Inteligencia Artificial)
- Fecha de Publicación: 13 de octubre de 2025
- Enlace del Artículo: https://arxiv.org/abs/2510.10956
La traducción de código C a código Rust seguro es un método efectivo para garantizar la seguridad de memoria. En comparación con los métodos de traducción basados en reglas que generan grandes cantidades de código inseguro, los métodos basados en modelos de lenguaje de gran escala (LLM) pueden generar código Rust más idiomático y seguro. Sin embargo, los métodos LLM existentes aún enfrentan dificultades en la traducción de C a Rust a nivel de proyecto, particularmente carecen de una perspectiva global al procesar punteros. Para abordar este problema, este artículo propone un novedoso Grafo de Conocimiento de Punteros C-Rust (KG), que enriquece el grafo de dependencias de código mediante dos semánticas de punteros: (1) información de uso de punteros que registra comportamientos globales; (2) anotaciones orientadas a Rust que codifican propiedad, mutabilidad, nulabilidad y tiempo de vida. Basándose en este grafo de conocimiento, se propone la técnica PTRMAPPER, que implementa la traducción de C a Rust a nivel de proyecto. Los experimentos demuestran que PTRMAPPER reduce el uso de código inseguro en un 99.9% en comparación con métodos basados en reglas y LLM tradicionales, y mejora la corrección funcional en un promedio del 29.3%.
El lenguaje C se utiliza ampliamente en sistemas operativos, sistemas embebidos y aplicaciones críticas de rendimiento, pero su gestión manual de memoria y operaciones directas con punteros frecuentemente conducen a vulnerabilidades de seguridad como desbordamientos de búfer y fugas de memoria. Rust, como alternativa moderna, garantiza la seguridad de memoria mientras mantiene el rendimiento del lenguaje C. Por lo tanto, la traducción automática de código C heredado a Rust se ha convertido en una necesidad urgente.
- Métodos basados en reglas: Dependen de reglas predefinidas, el código Rust generado utiliza extensamente bloques unsafe, punteros crudos y llamadas a funciones externas, presentando aún riesgos de seguridad
- Métodos LLM existentes: Adoptan un paradigma de traducción de unidades de abajo hacia arriba, carecen de una perspectiva global de uso de punteros, frecuentemente presentan conflictos de definición-uso en la traducción de punteros
Existen diferencias fundamentales entre C y Rust en el uso de punteros:
- Lenguaje C: Los punteros son altamente flexibles, al definirse solo se especifica el tipo, al usarse se pueden leer, escribir y modificar libremente
- Lenguaje Rust: El uso de punteros está estrictamente limitado, al definirse se debe especificar explícitamente la propiedad, mutabilidad y tiempo de vida, al usarse se deben cumplir estrictamente las reglas del verificador de préstamos
- Se propone un novedoso Grafo de Conocimiento de Punteros C-Rust (KG): Capaz de modelar integralmente dependencias de unidades de código, información de uso de punteros y anotaciones orientadas a Rust desde el contexto a nivel de proyecto
- Se diseña la técnica de traducción a nivel de proyecto PTRMAPPER: Utiliza el KG de punteros C-Rust en sinergia con LLM para traducir proyectos C a código Rust seguro e idiomático
- Se logra una mejora de rendimiento significativa: Genera código Rust más idiomático, más seguro y con mayor corrección
- Se proporciona verificación experimental integral: Los experimentos de ablación demuestran la importancia de la información de uso de punteros y las anotaciones orientadas a Rust para mejorar el rendimiento de traducción
Dado un proyecto C, traducirlo automáticamente a un proyecto Rust funcionalmente equivalente, seguro en memoria e idiomático. La entrada es un conjunto de archivos de código fuente C, la salida es un proyecto Rust compilable y ejecutable.
PTRMAPPER consta de tres fases principales:
Diseño del Esquema del Grafo de Conocimiento:
- Grafo de Dependencias de Código: Describe relaciones de dependencia entre unidades de código (funciones, estructuras, enumeraciones, etc.)
- Información de Uso de Punteros: Captura comportamiento de punteros a nivel de proyecto, incluyendo:
- Entidades: Param (parámetro), Value (valor de retorno), Member (miembro), Pointer (puntero), etc.
- Relaciones: derivesFrom (relación de derivación), mayAlias/noAlias (relación de alias), pointsTo (relación de apuntamiento), etc.
- Anotaciones Orientadas a Rust: Contienen semántica de propiedad, mutabilidad, nulabilidad, tiempo de vida, etc.
Proceso de Construcción:
- Extracción del Grafo de Dependencias de Código: Utiliza análisis estático para extraer unidades de código y sus relaciones de dependencia
- Extracción de Información de Uso de Punteros: Adopta estrategia de análisis sensible al contexto y sensible a campos
- Extracción de Anotaciones Orientadas a Rust: Analiza el tiempo de vida de punteros basándose en reglas predefinidas y anota la semántica correspondiente
Identificación y Ordenamiento de Unidades de Traducción:
- Utiliza el algoritmo de Tarjan para detectar componentes fuertemente conectados (SCC)
- Trata cada SCC como una unidad de traducción independiente
- El ordenamiento topológico determina el orden de traducción de abajo hacia arriba
Extracción de Semántica de Punteros:
Para cada unidad de traducción, extrae la semántica de punteros correspondiente del KG, proporcionada al LLM en forma de triples <entidad1, relación, entidad2>.
Traducción Incremental y Verificación:
- Integra la unidad de traducción, semántica de punteros y contexto Rust ya traducido en el indicador de traducción
- Cada unidad de traducción generada se integra inmediatamente en el proyecto Rust y se verifica mediante compilación
- Si ocurren errores, se activa el mecanismo de corrección de errores
Utiliza la versión Rust del KG de punteros para proporcionar al LLM contexto semántico a nivel de proyecto:
- Las relaciones de dependencia ayudan a identificar precisamente las unidades de código relacionadas con el error
- Las anotaciones orientadas a Rust proporcionan orientación semántica precisa para reparaciones efectivas
- Modelado de Semántica de Punteros Global: Primera integración de información de uso de punteros a nivel de proyecto y semántica específica de Rust en un grafo de conocimiento
- Paradigma de Traducción Sinérgica: Combina la perspectiva global del grafo de conocimiento con la capacidad generativa del LLM
- Mecanismo de Verificación Incremental: Detecta y corrige errores oportunamente, previniendo la acumulación de errores
- Corrección Inteligente de Errores: Basada en información semántica del KG en lugar de depender únicamente de mensajes de error del compilador
Utiliza 16 proyectos C reales del conjunto de datos CROWN, con líneas de código que van desde 154 a 14,829, incluyendo:
- Proyectos pequeños: avl, buffer, genann, quadtree, rgba, urlparser, etc.
- Proyectos grandes: bzip2, heman, lodepng, etc.
Para evaluar la equivalencia funcional, se construyeron manualmente pruebas unitarias, logrando una cobertura de líneas del 81.4%-97.7% y cobertura de funciones del 92.9%-100.0%.
Evaluación de Idiomaticidad:
- Lint Alert Count: Utiliza Rust-Clippy para contar advertencias de código no idiomático
- Unsafe Usage Count: Utiliza Cargo-geiger para contar el uso de código unsafe
Evaluación de Corrección:
- Compiled: Proporción de funciones compiladas exitosamente
- Equiv.: Proporción de funciones que pasan pruebas unitarias
- Comparación de Idiomaticidad: CROWN (basado en reglas), PR2 (reescritura LLM)
- Comparación de Corrección: FLOURINE (método LLM mejorado con pruebas difusas)
- Experimentos de Ablación: PTRTRANSPS, PTRTRANSPU, PTRTRANSRA, PTRTRANSEC, etc.
- LLM: ChatGPT-4o, temperature=0
- Análisis Estático: Clang, Doxygen, marco SVF
- Corrección de Errores: Máximo 5 iteraciones
- Verificación de Compilación: cargo check
Mejora Significativa de Idiomaticidad:
- Comparado con CROWN: Advertencias Lint reducidas en 94.9% (6,802→349), uso de unsafe reducido en 99.9% (141,866→85)
- Comparado con PR2: Advertencias Lint reducidas en 91.8% (4,272→349), uso de unsafe reducido en 99.9% (134,185→85)
Mejora Sustancial de Corrección:
- Comparado con FLOURINE: Tasa de compilación exitosa mejorada en 28.4% (98.3% vs 69.9%), tasa de equivalencia funcional mejorada en 29.3% (81.6% vs 52.3%)
- Proyectos pequeños (avl, rgba, ht, bst) logran 100% de equivalencia funcional
Los experimentos de ablación verifican la importancia de cada componente:
- Sin Semántica de Punteros (PTRTRANSPS): Tasa de equivalencia cae de 81.6% a 59.5%, disminución del 22.1%
- Solo Información de Uso de Punteros (PTRTRANSRA): Rendimiento inferior a la versión completa
- Solo Anotaciones Rust (PTRTRANSPU): Disminución de rendimiento similar
- Sin Corrección de Errores (PTRTRANSEC): Tasa de equivalencia cae de 81.6% a 50.8%, disminución del 30.8%
PTRMAPPER muestra rendimiento estable en diferentes niveles de complejidad:
- Líneas de Código: Rendimiento estable con aumento de complejidad, FLOURINE disminuye drásticamente
- Relaciones de Dependencia: Tasa de equivalencia del 57.1% cuando dependencias están en [16,44), FLOURINE es 0%
- Cantidad de Punteros: Tasa de equivalencia del 50.0% cuando punteros están en [20,50), FLOURINE es 0%
Tomando el proyecto Quadtree como ejemplo, se muestra cómo PTRMAPPER resuelve conflictos complejos de préstamos:
- Identifica que el parámetro
tree debe ser un préstamo inmutable &Quadtree - Separa
root como un préstamo mutable &mut QuadtreeNode - Extrae
key_free como parámetro independiente para evitar conflictos de préstamos - Maneja correctamente la semántica de propiedad
- Métodos basados en reglas: Corrode, C2RUST, etc., generan grandes cantidades de código unsafe
- Métodos basados en LLM: SPECTRA, FLOURINE, etc., carecen de perspectiva global
- Métodos de traducción de unidades: SYZYGY, etc., presentan problemas de pérdida de semántica de punteros
- Primera modelización sistemática de semántica de punteros a nivel de proyecto
- Método sinérgico que combina análisis estático y generación LLM
- Mejora significativa en seguridad y corrección
- El Grafo de Conocimiento de Punteros C-Rust resuelve efectivamente el problema de pérdida de semántica de punteros en traducción a nivel de proyecto
- La integración sinérgica de análisis estático y LLM mejora significativamente la calidad de traducción
- Los mecanismos de verificación incremental y corrección inteligente de errores garantizan la confiabilidad de la traducción
- Costo de Construcción: La construcción del grafo de conocimiento requiere tiempo adicional de análisis estático
- Dependencia de Reglas: La extracción de anotaciones Rust depende de reglas predefinidas, posiblemente con cobertura incompleta
- Escala de Proyecto: La escalabilidad en proyectos de muy gran escala requiere verificación adicional
- Intervención Manual: Casos complejos pueden requerir ajustes manuales limitados
- Optimizar la eficiencia de construcción del grafo de conocimiento
- Extender a más pares de lenguajes de programación
- Integrar más técnicas de análisis de programas
- Mejorar el grado de automatización
- Innovación Fuerte: Primera combinación de grafo de conocimiento y LLM para traducción de código, resolviendo problemas fundamentales de métodos existentes
- Método Sistemático: Análisis de problemas y diseño de soluciones completos, ruta técnica clara
- Experimentación Completa: 16 proyectos reales, múltiples métodos de comparación, experimentos de ablación detallados
- Resultados Significativos: Mejoras sustanciales en seguridad, idiomaticidad y corrección
- Alto Valor Práctico: Resuelve problemas de ingeniería reales, con fuertes perspectivas de aplicación
- Problema de Escalabilidad: La complejidad computacional del análisis estático puede limitar la aplicación en proyectos de muy gran escala
- Completitud de Reglas: Las reglas de extracción de anotaciones Rust pueden no cubrir todos los casos límite
- Limitaciones de Evaluación: Principalmente verificado en proyectos de mediano y pequeño tamaño, el rendimiento en proyectos grandes requiere verificación adicional
- Dependencia de Calidad: El efecto del método depende en gran medida de la precisión del análisis estático
- Contribución Académica: Proporciona un nuevo paradigma de investigación para el campo de traducción de código, combinando análisis de programas e IA generativa
- Valor de Ingeniería: Proporciona herramientas prácticas para migración de C a Rust, contribuyendo a mejorar la seguridad del software
- Inspiración Técnica: El enfoque de grafo de conocimiento guiando LLM puede generalizarse a otras tareas de generación de código
- Migración de Sistemas Heredados: Apropiado para proyectos que necesitan migrar bases de código C a Rust
- Aplicaciones Críticas de Seguridad: Sistemas de desarrollo con altos requisitos de seguridad de memoria
- Herramientas de Automatización: Puede integrarse en IDE o canalizaciones CI/CD
- Educación y Capacitación: Ayuda a desarrolladores a aprender conceptos de seguridad de memoria de Rust
El artículo cita 76 referencias relacionadas, cubriendo múltiples campos incluyendo traducción de código, análisis de programas y modelos de lenguaje de gran escala, proporcionando una base teórica sólida para la investigación.
Evaluación General: Este es un artículo de investigación de alta calidad en ingeniería de software que innovadoramente combina grafos de conocimiento y modelos de lenguaje de gran escala para resolver problemas clave en la traducción de C a Rust. El diseño del método es razonable, la verificación experimental es completa y los resultados son convincentes. Aunque existen algunas limitaciones, abre nuevas direcciones de investigación en el campo de traducción de código, con importante valor académico y significado práctico.