سیستم یادگیری ماشینی ControlFlag منبع باز اینتل برای شناسایی خطاهای کد

اینتل پیشرفت های مربوط به پروژه تحقیقاتی ControlFlag را با هدف ایجاد یک سیستم یادگیری ماشینی برای بهبود کیفیت کد کشف کرده است. جعبه ابزار تهیه شده توسط این پروژه، بر اساس یک مدل آموزش داده شده بر روی مقدار زیادی کد موجود، امکان شناسایی خطاها و ناهنجاری های مختلف در متون مبدأ نوشته شده به زبان های سطح بالا مانند C/C++ را می دهد. این سیستم برای شناسایی انواع مختلفی از مشکلات در کد، از شناسایی اشتباهات تایپی و ترکیبات نادرست تایپ، تا شناسایی بررسی های مقدار NULL از دست رفته در اشاره گرها و مشکلات حافظه، مناسب است. کد ControlFlag به زبان C++ نوشته شده است و تحت مجوز MIT منبع باز است.

این سیستم با ساخت یک مدل آماری از آرایه کد موجود پروژه های باز منتشر شده در GitHub و مخازن عمومی مشابه، خودآموز است. در مرحله آموزش، سیستم الگوهای معمولی را برای ساخت ساختارها در کد تعیین می کند و یک درخت نحوی از اتصالات بین این الگوها ایجاد می کند که جریان اجرای کد را در برنامه منعکس می کند. در نتیجه، یک درخت تصمیم گیری مرجع تشکیل می شود که تجربه توسعه همه کدهای منبع تحلیل شده را ترکیب می کند.

کد مورد بررسی تحت فرآیند مشابهی برای شناسایی الگوهایی است که در برابر درخت تصمیم مرجع بررسی می شوند. اختلاف زیاد با شاخه های همسایه نشان دهنده وجود یک ناهنجاری در الگوی در حال بررسی است. این سیستم همچنین به شما این امکان را می دهد که نه تنها یک خطا را در قالب شناسایی کنید، بلکه یک اصلاح را نیز پیشنهاد دهید. به عنوان مثال، در کد OpenSSL، ساختار "(s1 == NULL) ∧ (s2 == NULL)" شناسایی شد که تنها 8 بار در درخت نحو ظاهر شد، در حالی که نزدیکترین شاخه با مقدار "(s1 == NULL) || (s2 == NULL)” حدود 7 هزار بار رخ داده است. سیستم همچنین یک ناهنجاری "(s1 == NULL) |. را شناسایی کرد (s2 == NULL)” که 32 بار در درخت ظاهر شد.

سیستم یادگیری ماشینی ControlFlag منبع باز اینتل برای شناسایی خطاهای کد

هنگام تجزیه و تحلیل قطعه کد "اگر (x = 7) y = x;" سیستم تعیین کرده است که ساختار "متغیر == عدد" معمولا در عملگر "if" برای مقایسه مقادیر عددی استفاده می شود، بنابراین به احتمال زیاد علامت "متغیر = عدد" در عبارت "if" ناشی از یک غلط املایی تحلیلگرهای استاتیک سنتی چنین خطایی را تشخیص می دادند، اما برخلاف آنها، ControlFlag قوانین آماده ای را اعمال نمی کند، که در آن ارائه همه گزینه های ممکن دشوار است، بلکه بر اساس آمار استفاده از ساختارهای مختلف در تعداد زیادی است. از پروژه ها

به عنوان یک آزمایش، با استفاده از ControlFlag در کد منبع ابزار cURL، که اغلب به عنوان نمونه ای از کد با کیفیت و آزمایش شده ذکر می شود، خطایی که توسط تحلیلگرهای استاتیک شناسایی نشده بود، هنگام استفاده از عنصر ساختار "s->keepon" شناسایی شد. که دارای نوع عددی بود، اما با مقدار بولی TRUE مقایسه شد. در کد OpenSSL، علاوه بر مشکل فوق با "(s1 == NULL) ∧ (s2 == NULL)"، ناهنجاری هایی نیز در عبارات "(-2 == rv)" شناسایی شد (منهای یک اشتباه تایپی) و "BIO_puts(bp، ":")

منبع: opennet.ru

اضافه کردن نظر