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.
- معرّف الورقة: 2510.10956
- العنوان: Project-Level C-to-Rust Translation via Synergistic Integration of Knowledge Graphs and Large Language Models
- المؤلفون: Zhiqiang Yuan, Wenjun Mao, Zhuo Chen, Xiyue Shang, Chong Wang, Yiling Lou, Xin Peng
- التصنيف: cs.SE (هندسة البرمجيات)، cs.AI (الذكاء الاصطناعي)
- تاريخ النشر: 13 أكتوبر 2025
- رابط الورقة: https://arxiv.org/abs/2510.10956
تحويل كود C إلى كود Rust آمن يعتبر طريقة فعالة لضمان سلامة الذاكرة. بالمقارنة مع طرق الترجمة القائمة على القواعد التي تنتج كمية كبيرة من الأكواد غير الآمنة، فإن الطرق القائمة على نماذج اللغة الكبيرة (LLM) قادرة على توليد كود Rust أكثر اتباعاً للأعراف وأماناً. ومع ذلك، تواجه طرق LLM الحالية صعوبات في ترجمة C إلى Rust على مستوى المشروع، خاصة في التعامل مع المؤشرات حيث تفتقر إلى المنظور العام. لحل هذه المشكلة، تقترح هذه الورقة رسم بياني معرفة جديد لمؤشرات C-Rust (KG)، يثري رسم بيانات اعتماديات الكود من خلال نوعين من دلالات المؤشرات: (1) معلومات استخدام المؤشرات التي تسجل السلوك العام؛ (2) تعليقات موجهة نحو Rust تشفر الملكية والقابلية للتغيير والقابلية للقيمة الفارغة ودورات الحياة. بناءً على هذا الرسم البياني للمعرفة، تم اقتراح تقنية PTRMAPPER لتحقيق ترجمة C إلى Rust على مستوى المشروع. تظهر التجارب أن PTRMAPPER تقلل من استخدام الأكواد غير الآمنة بنسبة 99.9% مقارنة بالطرق القائمة على القواعد وطرق LLM التقليدية، وتحسن الصحة الوظيفية بمتوسط 29.3%.
يتم استخدام لغة C على نطاق واسع في أنظمة التشغيل والأنظمة المدمجة والتطبيقات الحساسة للأداء، لكن إدارة الذاكرة اليدوية والعمليات المباشرة على المؤشرات غالباً ما تؤدي إلى ثغرات أمان مثل تجاوز المخزن المؤقت وتسرب الذاكرة. تعتبر Rust بديلاً حديثاً يحافظ على أداء C مع ضمان سلامة الذاكرة. لذلك، أصبحت الترجمة الآلية للأكواس الموروثة من C إلى Rust حاجة ملحة.
- الطرق القائمة على القواعد: تعتمد على قواعد محددة مسبقاً، وينتج عنها كود Rust يستخدم بكثرة كتل unsafe والمؤشرات الخام واستدعاءات الدوال الخارجية، مما يترك مخاطر أمان
- طرق LLM الحالية: تعتمد على نموذج ترجمة من أسفل إلى أعلى للوحدات الفردية، وتفتقر إلى المنظور العام لاستخدام المؤشرات، وغالباً ما تحدث تضاربات في التعريف والاستخدام عند ترجمة المؤشرات
توجد اختلافات أساسية بين C و Rust في استخدام المؤشرات:
- لغة C: المؤشرات مرنة جداً، يتم تحديد النوع فقط عند التعريف، ويمكن قراءة وكتابة وتعديل المؤشر بحرية عند الاستخدام
- لغة Rust: استخدام المؤشرات يخضع لقيود صارمة، يجب تحديد الملكية والقابلية للتغيير ودورة الحياة بوضوح عند التعريف، ويجب الامتثال الصارم لقواعد مدقق الاستعارة عند الاستخدام
- اقتراح رسم بياني معرفة جديد لمؤشرات C-Rust (KG): يمكنه نمذجة شاملة لاعتماديات وحدات الكود ومعلومات استخدام المؤشرات والتعليقات الموجهة نحو Rust من سياق مستوى المشروع
- تصميم تقنية ترجمة PTRMAPPER على مستوى المشروع: تستفيد من التعاون بين رسم بياني المعرفة C-Rust و LLM لترجمة مشاريع C إلى كود Rust آمن واتباعي
- تحقيق تحسينات أداء كبيرة: توليد كود Rust أكثر اتباعاً للأعراف وأماناً وصحة أعلى
- توفير التحقق التجريبي الشامل: تثبت التجارب الاستئصالية أهمية معلومات استخدام المؤشرات والتعليقات الموجهة نحو Rust في تحسين أداء الترجمة
بالنظر إلى مشروع C، قم بترجمته تلقائياً إلى مشروع Rust معادل وظيفياً وآمناً من حيث الذاكرة واتباعياً. المدخلات عبارة عن مجموعة من ملفات كود المصدر C، والمخرجات عبارة عن مشروع Rust قابل للترجمة والتشغيل.
يتضمن PTRMAPPER ثلاث مراحل رئيسية:
تصميم نمط الرسم البياني للمعرفة:
- رسم بياني اعتماديات الكود: يصف العلاقات الاعتمادية بين وحدات الكود (الدوال والهياكل والتعددات وما إلى ذلك)
- معلومات استخدام المؤشرات: تلتقط السلوك العام للمؤشرات على مستوى المشروع، بما في ذلك:
- الكيانات: Param (المعاملات)، Value (القيم المرجعة)، Member (الأعضاء)، Pointer (المؤشرات) وغيرها
- العلاقات: derivesFrom (علاقة الاشتقاق)، mayAlias/noAlias (علاقات الاسم المستعار)، pointsTo (علاقات الإشارة) وغيرها
- التعليقات الموجهة نحو Rust: تتضمن دلالات الملكية والقابلية للتغيير والقابلية للقيمة الفارغة ودورات الحياة
عملية البناء:
- استخراج رسم بياني اعتماديات الكود: استخدام التحليل الثابت لاستخراج وحدات الكود والعلاقات الاعتمادية
- استخراج معلومات استخدام المؤشرات: اعتماد استراتيجية تحليل حساسة للسياق وحساسة للحقول
- استخراج التعليقات الموجهة نحو Rust: تحليل دورة حياة المؤشر بناءً على القواعس المحددة مسبقاً وتعليق الدلالات المقابلة
تحديد وحدات الترجمة والترتيب:
- استخدام خوارزمية Tarjan للكشف عن المكونات المتصلة بقوة (SCC)
- معاملة كل SCC كوحدة ترجمة مستقلة
- الترتيب الطوبولوجي لتحديد ترتيب الترجمة من أسفل إلى أعلى
استخراج دلالات المؤشرات:
استخراج معرفة دلالات المؤشرات المقابلة لكل وحدة ترجمة من KG، وتقديمها إلى LLM بصيغة ثلاثية <الكيان1، العلاقة، الكيان2>.
الترجمة الإضافية والتحقق:
- دمج وحدة الترجمة ومعرفة دلالات المؤشرات وسياق Rust المترجم بالفعل في موجه الترجمة
- التحقق الفوري من كل وحدة ترجمة بعد توليدها والتكامل مع مشروع Rust
- تفعيل آلية تصحيح الأخطاء عند حدوث أخطاء
الاستفادة من نسخة Rust من رسم بياني معرفة المؤشرات لتوفير سياق دلالي على مستوى المشروع إلى LLM:
- تساعد العلاقات الاعتمادية في تحديد وحدات الكود ذات الصلة بالخطأ بدقة
- توفر التعليقات الموجهة نحو Rust إرشادات دلالية دقيقة لإصلاح فعال
- نمذجة دلالات المؤشرات العامة: أول مرة يتم دمج معلومات استخدام المؤشرات على مستوى المشروع والدلالات المحددة لـ Rust في رسم بياني معرفة
- نموذج ترجمة تآزري: الجمع بين المنظور العام لرسم بياني المعرفة وقدرات التوليد لـ LLM
- آلية التحقق الإضافية: اكتشاف وتصحيح الأخطاء في الوقت المناسب لمنع تراكم الأخطاء
- تصحيح أخطاء ذكي: بناءً على معلومات دلالية من KG وليس فقط على رسائل خطأ المترجم
استخدام 16 مشروع C حقيقي من مجموعة بيانات CROWN، تتراوح أسطر الكود من 154 إلى 14,829، بما في ذلك:
- مشاريع صغيرة: avl, buffer, genann, quadtree, rgba, urlparser وغيرها
- مشاريع كبيرة: bzip2, heman, lodepng وغيرها
لتقييم التكافؤ الوظيفي، تم بناء اختبارات وحدة يدوية حققت معدل تغطية أسطر 81.4%-97.7% ومعدل تغطية دوال 92.9%-100.0%.
تقييم الاتباعية:
- عدد تنبيهات Lint: استخدام Rust-Clippy لإحصاء عدد تنبيهات الكود غير الاتباعي
- عدد استخدامات Unsafe: استخدام Cargo-geiger لإحصاء عدد استخدامات كود unsafe
تقييم الصحة:
- Compiled: نسبة الدوال التي تم ترجمتها بنجاح
- Equiv.: نسبة الدوال التي اجتازت اختبارات الوحدة
- مقارنة الاتباعية: CROWN (قائمة على القواعد)، PR2 (إعادة كتابة LLM)
- مقارنة الصحة: FLOURINE (طريقة LLM معززة بالاختبار الغامض)
- التجارب الاستئصالية: PTRTRANSPS, PTRTRANSPU, PTRTRANSRA, PTRTRANSEC وغيرها
- LLM: ChatGPT-4o، temperature=0
- التحليل الثابت: Clang, Doxygen, إطار عمل SVF
- تصحيح الأخطاء: بحد أقصى 5 تكرارات
- التحقق من الترجمة: cargo check
تحسن كبير في الاتباعية:
- مقارنة بـ CROWN: تقليل تنبيهات Lint بنسبة 94.9% (6,802→349)، تقليل استخدام unsafe بنسبة 99.9% (141,866→85)
- مقارنة بـ PR2: تقليل تنبيهات Lint بنسبة 91.8% (4,272→349)، تقليل استخدام unsafe بنسبة 99.9% (134,185→85)
تحسن كبير في الصحة:
- مقارنة بـ FLOURINE: تحسن معدل الترجمة الناجحة بنسبة 28.4% (98.3% مقابل 69.9%)، تحسن معدل التكافؤ الوظيفي بنسبة 29.3% (81.6% مقابل 52.3%)
- المشاريع الصغيرة (avl, rgba, ht, bst) حققت 100% تكافؤ وظيفي
تثبت التجارب الاستئصالية أهمية كل مكون:
- بدون دلالات المؤشرات (PTRTRANSPS): انخفاض معدل التكافؤ من 81.6% إلى 59.5%، انخفاض بنسبة 22.1%
- معلومات استخدام المؤشرات فقط (PTRTRANSRA): أداء أقل من النسخة الكاملة
- تعليقات Rust فقط (PTRTRANSPU): انخفاض الأداء بالمثل
- بدون تصحيح أخطاء (PTRTRANSEC): انخفاض معدل التكافؤ من 81.6% إلى 50.8%، انخفاض بنسبة 30.8%
يظهر PTRMAPPER أداءً مستقراً في مستويات تعقيد مختلفة:
- عدد أسطر الكود: الأداء مستقرة مع زيادة التعقيد، بينما تنخفض FLOURINE بشكل حاد
- العلاقات الاعتمادية: معدل التكافؤ 57.1% عندما يكون عدد الاعتماديات [16,44)، بينما FLOURINE 0%
- عدد المؤشرات: معدل التكافؤ 50.0% عندما يكون عدد المؤشرات [20,50)، بينما FLOURINE 0%
باستخدام مشروع Quadtree كمثال، يوضح كيف يحل PTRMAPPER تضاربات الاستعارة المعقدة:
- تحديد أن معامل
tree يجب أن يكون استعارة غير قابلة للتغيير &Quadtree - فصل
root كاستعارة قابلة للتغيير &mut QuadtreeNode - استخراج
key_free كمعامل مستقل لتجنب تضاربات الاستعارة - معالجة صحيحة لدلالات الملكية
- الطرق القائمة على القواعد: Corrode, C2RUST وغيرها، تنتج كمية كبيرة من كود unsafe
- طرق قائمة على LLM: SPECTRA, FLOURINE وغيرها، تفتقر إلى المنظور العام
- طرق ترجمة الوحدات: SYZYGY وغيرها، توجد مشاكل في فقدان دلالات المؤشرات
- أول نمذجة منهجية لدلالات المؤشرات على مستوى المشروع
- طريقة تآزرية تجمع بين التحليل الثابت وتوليد LLM
- تحسن كبير في الأمان والصحة
- يحل رسم بياني معرفة مؤشرات C-Rust بفعالية مشكلة فقدان دلالات المؤشرات في الترجمة على مستوى المشروع
- التكامل التآزري للتحليل الثابت و LLM يحسن بشكل كبير من جودة الترجمة
- آليات التحقق الإضافية وتصحيح الأخطاء الذكية تضمن موثوقية الترجمة
- تكلفة البناء: يتطلب بناء رسم بياني المعرفة وقتاً إضافياً للتحليل الثابت
- الاعتماد على القواعس: استخراج تعليقات Rust يعتمد على قواعس محددة مسبقاً، قد لا تغطي جميع الحالات الحدية
- حجم المشروع: قابلية التوسع للمشاريع الكبيرة جداً تحتاج إلى التحقق الإضافي
- التدخل اليدوي: قد تتطلب الحالات المعقدة تدخلاً يدوياً محدوداً
- تحسين كفاءة بناء رسم بياني المعرفة
- التوسع إلى المزيد من أزواج لغات البرمجة
- دمج المزيد من تقنيات تحليل البرامج
- تحسين درجة الأتمتة
- ابتكار قوي: أول دمج لرسم بياني المعرفة و LLM في ترجمة الأكواد، يحل المشاكل الأساسية للطرق الموجودة
- طريقة منهجية: التحليل الشامل للمشكلة وتصميم الحل منطقي وواضح
- تجارب شاملة: 16 مشروع حقيقي، طرق مقارنة متعددة، تجارب استئصالية مفصلة
- نتائج ملحوظة: تحسن كبير في الأمان والاتباعية والصحة
- قيمة عملية عالية: حل مشكلة هندسية فعلية، آفاق تطبيق قوية
- مشاكل قابلية التوسع: قد تحد التعقيدية الحسابية للتحليل الثابت من التطبيق على المشاريع الكبيرة جداً
- اكتمال القواعس: قد لا تغطي قواعس استخراج تعليقات Rust جميع حالات الحدود
- قيود التقييم: التحقق الأساسي على مشاريع متوسطة وصغيرة، أداء المشاريع الكبيرة تحتاج إلى التحقق الإضافي
- الاعتماد على الجودة: تعتمد فعالية الطريقة بشكل كبير على دقة التحليل الثابت
- المساهمة الأكاديمية: توفير نموذج بحثي جديد لمجال ترجمة الأكواد، يجمع بين تحليل البرامج والذكاء الاصطناعي التوليدي
- القيمة الهندسية: توفير أداة عملية لهجرة C إلى Rust، يساعد على تحسين أمان البرمجيات
- الإلهام التقني: يمكن تعميم فكرة رسم بياني المعرفة الموجه لـ LLM على مهام توليد أكواد أخرى
- هجرة الأنظمة الموروثة: مناسب للمشاريع التي تحتاج إلى هجرة مكتبات كود C إلى Rust
- التطبيقات الحساسة للأمان: الأنظمة التي تتطلب درجة عالية من أمان الذاكرة
- أدوات الأتمتة: يمكن دمجها في بيئات التطوير المتكاملة أو خطوط أنابيب CI/CD
- التعليم والتدريب: مساعدة المطورين على تعلم مفاهيم أمان الذاكرة في Rust
تستشهد الورقة بـ 76 مرجعاً ذا صلة، تغطي مجالات متعددة مثل ترجمة الأكواد وتحليل البرامج ونماذج اللغة الكبيرة، مما يوفر أساساً نظرياً متيناً للبحث.
التقييم الإجمالي: هذه ورقة بحثية عالية الجودة في مجال هندسة البرمجيات، تجمع بشكل مبتكر بين رسم بياني المعرفة ونماذج اللغة الكبيرة لحل المشاكل الرئيسية في ترجمة C إلى Rust. تتميز بتصميم طريقة معقول وتحقق تجريبي شامل ونتائج مقنعة. على الرغم من وجود بعض القيود، إلا أنها تفتح اتجاهاً بحثياً جديداً في مجال ترجمة الأكواد، وتتمتع بقيمة أكاديمية وعملية مهمة.