Intel đã mở mã hệ thống máy học ControlFlag để xác định lỗi trong mã

Intel đã phát hiện ra những phát triển liên quan đến dự án nghiên cứu ControlFlag nhằm tạo ra một hệ thống máy học để cải thiện chất lượng mã. Bộ công cụ do dự án chuẩn bị cho phép, dựa trên mô hình được đào tạo trên một lượng lớn mã hiện có, xác định các lỗi và điểm bất thường khác nhau trong văn bản nguồn được viết bằng các ngôn ngữ cấp cao như C/C++. Hệ thống này phù hợp để xác định các loại vấn đề khác nhau trong mã, từ xác định lỗi chính tả và kết hợp loại không chính xác, đến xác định việc kiểm tra giá trị NULL bị thiếu trong các vấn đề về con trỏ và bộ nhớ. Mã ControlFlag được viết bằng C++ và có nguồn mở theo giấy phép MIT.

Hệ thống này tự học bằng cách xây dựng mô hình thống kê về mảng mã hiện có của các dự án mở được xuất bản trên GitHub và các kho công cộng tương tự. Ở giai đoạn huấn luyện, hệ thống xác định các mẫu điển hình để xây dựng cấu trúc trong mã và xây dựng cây cú pháp kết nối giữa các mẫu này, phản ánh luồng thực thi mã trong chương trình. Kết quả là một cây ra quyết định tham chiếu được hình thành kết hợp kinh nghiệm phát triển của tất cả các mã nguồn được phân tích.

Mã đang được xem xét trải qua một quá trình tương tự để xác định các mẫu được kiểm tra dựa trên cây quyết định tham chiếu. Sự khác biệt lớn với các nhánh lân cận cho thấy sự hiện diện của sự bất thường trong mẫu đang được kiểm tra. Hệ thống cũng cho phép bạn không chỉ xác định lỗi trong mẫu mà còn đề xuất sửa lỗi. Ví dụ: trong mã OpenSSL, cấu trúc “(s1 == NULL) ∧ (s2 == NULL)” đã được xác định, chỉ xuất hiện trong cây cú pháp 8 lần, trong khi nhánh gần nhất có giá trị “(s1 == KHÔNG) || (s2 == NULL)” xảy ra khoảng 7 nghìn lần. Hệ thống cũng phát hiện sự bất thường “(s1 == NULL) | (s2 == NULL)” xuất hiện 32 lần trong cây.

Intel đã mở mã hệ thống máy học ControlFlag để xác định lỗi trong mã

Khi phân tích đoạn mã “if (x = 7) y = x;” Hệ thống đã xác định rằng cấu trúc “biến == số” thường được sử dụng trong toán tử “if” để so sánh các giá trị số, do đó rất có thể dấu hiệu “biến = số” trong biểu thức “if” là do một lỗi đánh máy. Các máy phân tích tĩnh truyền thống có thể đã phát hiện ra lỗi như vậy, nhưng không giống như chúng, ControlFlag không áp dụng các quy tắc có sẵn, trong đó rất khó cung cấp tất cả các tùy chọn có thể mà dựa trên số liệu thống kê về việc sử dụng nhiều cấu trúc khác nhau với số lượng lớn của các dự án.

Là một thử nghiệm, sử dụng ControlFlag trong mã nguồn của tiện ích cURL, thường được trích dẫn làm ví dụ về mã chất lượng cao và đã được kiểm tra, một lỗi không được máy phân tích tĩnh phát hiện đã được xác định khi sử dụng thành phần cấu trúc “s->keepon”, có kiểu số nhưng được so sánh với giá trị Boolean TRUE . Trong mã OpenSSL, ngoài vấn đề nêu trên với "(s1 == NULL) ∧ (s2 == NULL)", các điểm bất thường cũng được xác định trong các biểu thức "(-2 == rv)" (điểm trừ là lỗi đánh máy) và "BIO_puts(bp, ://:")

Nguồn: opennet.ru

Thêm một lời nhận xét