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

به عنوان نمونهای از قابلیتهای ControlFlag، توسعهدهندگان کد منبع پروژههای OpenSSL و cURL را تجزیه و تحلیل کردند:
- در OpenSSL، ساختارهای غیرعادی در ساختارهای "(s1 == NULL) ∧ (s2 == NULL)" و "(s1 == NULL) | (s2 == NULL)" کشف شدند که با الگوی رایج "(s1 == NULL) || (s2 == NULL)" مطابقت ندارند. این کد همچنین حاوی ناهنجاریهایی در عبارات "(-2 == rv)" (علامت منها یک اشتباه تایپی بود) و "BIO_puts(bp, ":") <= 0)" بود (در زمینه بررسی موفقیت تابع، باید "== 0" میبود).
- خطایی در cURL کشف شد که هنگام استفاده از عنصر ساختار "s->keepon" که نوع عددی داشت اما با مقدار بولی TRUE مقایسه میشد، توسط تحلیلگران استاتیک شناسایی نشد.
ویژگیهای کلیدی ControlFlag 1.0 شامل پشتیبانی کامل از قالبهای استاندارد زبان C و قابلیت تشخیص ناهنجاریها در عبارات شرطی "if" است. برای مثال، هنگام تجزیه و تحلیل قطعه کد "if (x = 7) y = x;"، سیستم تشخیص میدهد که عبارت "if" معمولاً از ساختار "variable == number" برای مقایسه مقادیر عددی استفاده میکند، بنابراین بند "variable = number" در عبارت "if" احتمالاً یک اشتباه تایپی است. اسکریپتی برای بارگذاری مخازن موجود زبان C در GitHub و استفاده از آنها برای ساخت یک مدل گنجانده شده است. مدلهای از پیش ساخته شده نیز در دسترس هستند که به شما امکان میدهند بلافاصله بررسی کد خود را شروع کنید.
منبع: opennet.ru
