Intel open source systém strojového učení ControlFlag k identifikaci chyb kódu

Intel objevil vývoj související s výzkumným projektem ControlFlag zaměřeným na vytvoření systému strojového učení pro zlepšení kvality kódu. Toolkit připravený projektem umožňuje na základě modelu trénovaného na velkém množství existujícího kódu identifikovat různé chyby a anomálie ve zdrojových textech napsaných ve vyšších jazycích, jako je C/C++. Systém je vhodný pro identifikaci různých typů problémů v kódu, od identifikace překlepů a nesprávných kombinací typů až po identifikaci chybějících kontrol NULL hodnot v ukazatelích a problémů s pamětí. Kód ControlFlag je napsán v C++ a je open source pod licencí MIT.

Systém se sám učí vytvářením statistického modelu stávajícího pole kódů otevřených projektů publikovaných na GitHubu a podobných veřejných úložištích. Ve fázi školení systém určuje typické vzory pro vytváření struktur v kódu a vytváří syntaktický strom spojení mezi těmito vzory, odrážející tok provádění kódu v programu. Výsledkem je vytvoření referenčního rozhodovacího stromu, který kombinuje vývojové zkušenosti všech analyzovaných zdrojových kódů.

Kontrolovaný kód prochází podobným procesem identifikace vzorů, které jsou kontrolovány podle referenčního rozhodovacího stromu. Velké nesrovnalosti se sousedními větvemi naznačují přítomnost anomálie v kontrolovaném vzoru. Systém také umožňuje nejen identifikovat chybu v šabloně, ale také navrhnout opravu. Například v kódu OpenSSL byla identifikována konstrukce „(s1 == NULL) ∧ (s2 == NULL)“, která se v syntaktickém stromu objevila pouze 8krát, přičemž nejbližší větev s hodnotou „(s1 == NULL) || (s2 == NULL)“ došlo asi 7 tisíckrát. Systém také detekoval anomálii „(s1 == NULL) | (s2 == NULL)“, který se ve stromu objevil 32krát.

Intel open source systém strojového učení ControlFlag k identifikaci chyb kódu

Při analýze fragmentu kódu „if (x = 7) y = x;“ Systém zjistil, že konstrukce „proměnná == číslo“ se obvykle používá v operátoru „if“ k porovnání číselných hodnot, takže je vysoce pravděpodobné, že označení „proměnná = číslo“ ve výrazu „if“ je způsobeno překlep. Tradiční statické analyzátory by takovou chybu zachytily, ale na rozdíl od nich ControlFlag neuplatňuje hotová pravidla, ve kterých je obtížné poskytnout všechny možné možnosti, ale je založen na statistikách použití různých struktur ve velkém množství projektů.

V rámci experimentu s použitím ControlFlag ve zdrojovém kódu obslužného programu cURL, který je často uváděn jako příklad vysoce kvalitního a testovaného kódu, byla identifikována chyba, kterou statické analyzátory neodhalily, při použití prvku struktury „s->keepon“, který měl číselný typ, ale byl porovnán s booleovskou hodnotou TRUE . V kódu OpenSSL byly kromě výše uvedeného problému s "(s1 == NULL) ∧ (s2 == NULL)" identifikovány anomálie také ve výrazech "(-2 == rv)" (mínus byl překlep) a "BIO_puts(bp, ":")

Zdroj: opennet.ru

Přidat komentář