انتشار ControlFlag 1.0، ابزاری برای شناسایی خطاها در کد C

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

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

انتشار ControlFlag 1.0، ابزاری برای شناسایی خطاها در کد C

به عنوان نمونه ای از قابلیت های ControlFlag، توسعه دهندگان کدهای منبع پروژه های OpenSSL و cURL را تجزیه و تحلیل کردند:

  • ساختارهای غیرعادی "(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 و توانایی تشخیص ناهنجاری‌ها در عبارات شرطی «اگر» وجود دارد. به عنوان مثال، هنگام تجزیه و تحلیل قطعه کد "اگر (x = 7) y = x;" سیستم تعیین خواهد کرد که عبارت "if" معمولاً از ساختار "متغیر == عدد" برای مقایسه مقادیر عددی استفاده می کند، بنابراین به احتمال زیاد "متغیر = عدد" در عبارت "if" ناشی از اشتباه تایپی است. این کیت شامل یک اسکریپت است که به شما امکان می دهد مخازن موجود زبان C را در GitHub دانلود کنید و از آنها برای ساخت مدل استفاده کنید. مدل‌های آماده نیز موجود است که به شما امکان می‌دهد فوراً کد را بررسی کنید.

منبع: opennet.ru

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