نظام التعلم الآلي ControlFlag مفتوح المصدر من Intel لتحديد أخطاء التعليمات البرمجية

اكتشفت إنتل تطورات تتعلق بمشروع بحث ControlFlag الذي يهدف إلى إنشاء نظام للتعلم الآلي لتحسين جودة التعليمات البرمجية. تسمح مجموعة الأدوات التي أعدها المشروع، بناءً على نموذج تم تدريبه على كمية كبيرة من التعليمات البرمجية الموجودة، بتحديد الأخطاء المختلفة والشذوذات في النصوص المصدر المكتوبة بلغات عالية المستوى مثل C/C++. النظام مناسب لتحديد أنواع مختلفة من المشكلات في التعليمات البرمجية، بدءًا من تحديد الأخطاء المطبعية ومجموعات الأنواع غير الصحيحة، وحتى تحديد عمليات التحقق من القيمة NULL المفقودة في المؤشرات ومشاكل الذاكرة. كود ControlFlag مكتوب بلغة C++ وهو مفتوح المصدر بموجب ترخيص MIT.

النظام عبارة عن تعلم ذاتي من خلال بناء نموذج إحصائي لمجموعة التعليمات البرمجية الحالية للمشاريع المفتوحة المنشورة في GitHub والمستودعات العامة المماثلة. في مرحلة التدريب، يحدد النظام الأنماط النموذجية لبناء الهياكل في الكود ويبني شجرة نحوية من الروابط بين هذه الأنماط، مما يعكس تدفق تنفيذ التعليمات البرمجية في البرنامج. ونتيجة لذلك، يتم تشكيل شجرة مرجعية لاتخاذ القرار تجمع بين تجربة التطوير لجميع أكواد المصدر التي تم تحليلها.

يخضع الكود قيد المراجعة لعملية مماثلة لتحديد الأنماط التي يتم فحصها مقابل شجرة القرار المرجعية. تشير التناقضات الكبيرة مع الفروع المجاورة إلى وجود شذوذ في النمط الذي يتم فحصه. يسمح لك النظام أيضًا ليس فقط بتحديد الخطأ في القالب، ولكن أيضًا باقتراح التصحيح. على سبيل المثال، في كود OpenSSL تم تحديد البناء “(s1 == NULL) ∧ (s2 == NULL)” والذي ظهر في شجرة بناء الجملة 8 مرات فقط، بينما أقرب فرع له القيمة “(s1 == فارغة) || (s2 == NULL)" حدث حوالي 7 آلاف مرة. اكتشف النظام أيضًا حالة شاذة "(s1 == NULL) | (s2 == NULL)" والتي ظهرت 32 مرة في الشجرة.

نظام التعلم الآلي ControlFlag مفتوح المصدر من Intel لتحديد أخطاء التعليمات البرمجية

عند تحليل جزء الكود "if (x = 7) y = x;" لقد قرر النظام أن بناء "المتغير == رقم" يُستخدم عادةً في عامل التشغيل "if" لمقارنة القيم الرقمية، لذا فمن المحتمل جدًا أن تكون الإشارة "متغير = رقم" في التعبير "if" ناتجة عن خطأ مطبعي. كان من الممكن أن تكتشف أجهزة التحليل الثابتة التقليدية مثل هذا الخطأ، ولكن على عكسها، لا يطبق ControlFlag قواعد جاهزة، حيث يصعب توفير جميع الخيارات الممكنة، ولكنه يعتمد على إحصائيات استخدام الهياكل المختلفة بعدد كبير من المشاريع.

كتجربة، باستخدام ControlFlag في التعليمات البرمجية المصدر للأداة المساعدة cURL، والتي غالبًا ما يتم الاستشهاد بها كمثال للتعليمات البرمجية عالية الجودة والمختبرة، تم التعرف على خطأ لم يتم اكتشافه بواسطة المحللين الثابتين عند استخدام عنصر البنية "s->keepon"، والتي كانت ذات نوع رقمي، ولكن تمت مقارنتها بالقيمة المنطقية TRUE . في كود OpenSSL، بالإضافة إلى المشكلة المذكورة أعلاه مع "(s1 == NULL) ∧ (s2 == NULL)"، تم تحديد الحالات الشاذة أيضًا في التعبيرات "(-2 == rv)" (كان الطرح خطأ مطبعي) و"BIO_puts(bp, ):")

المصدر: opennet.ru

إضافة تعليق