Společnost Intel zveřejnila práce spojené s výzkumným projektem ControlFlag, jehož cílem je vytvořit systém strojového učení pro zlepšení kvality kódu. Nástroje připravené projektem umožňují na základě modelu vyškoleného na velkém objemu existujícího kódu identifikovat různé chyby a anomálie v zdrojových textech napsaných ve vysoce úrovňových jazycích, jako jsou C/C++. Systém je vhodný pro určení různých typů problémů v kódu, od odhalování překlepů a nesprávných kombinací typů po identifikaci vynechaných kontrol hodnoty NULL v ukazatelích a problémů s pamětí. Kód ControlFlag je napsán v jazyce C++ a je otevřený pod licencí MIT.
Systém se sám učí tím, že vytváří statistický model stávajícího souboru kódu otevřených projektů publikovaných na GitHubu a podobných veřejných repozitářích. V průběhu učení systém určuje typické vzory strukturování konstrukcí v kódu a vytváří syntaktický strom vazeb mezi těmito vzory, který odráží tok vykonávání kódu v programu. V důsledku toho se vyvíjí referenční rozhodovací strom, který integruje zkušenosti z vývoje všech analyzovaných zdrojových textů.
Pro kontrolovaný kód se provádí podobný proces identifikace vzorů, které jsou porovnávány s referenčním rozhodovacím stromem. Velké odchylky od sousedních větví naznačují přítomnost anomálie v zkoumaném vzoru. Systém také umožňuje nejen odhalit chybu v vzoru, ale také navrhnout opravu. Například v kódu OpenSSL byla odhalena konstrukce „(s1 == NULL) ∧ (s2 == NULL)“, která se v syntaktickém stromě objevila pouze 8krát, zatímco nejbližší větev se hodnotou „(s1 == NULL) || (s2 == NULL)“ se objevila přibližně 7 tisíckrát. Systém také identifikoval anomálii „(s1 == NULL) | (s2 == NULL)“, která se v stromě objevila 32krát.

Při analýze fragmentu kódu „if (x = 7) y = x;“ systém zjistil, že obvykle se v operátoru „if“ pro porovnání číselných hodnot používá konstrukce „proměnná == číslo“, a proto je velmi pravděpodobné, že označení „proměnná = číslo“ ve výrazu „if“ je způsobeno překlepem. Takovou chybu by odhalily i tradiční statické analyzátory, ale na rozdíl od nich ControlFlag nepoužívá hotová pravidla, ve kterých je těžké předvídat všechny možné varianty, ale vychází ze statistiky využití různých konstrukcí v mnoha projektech.
Jako experiment byla pomocí ControlFlag ve zdrojových textech utility cURL, která je často uváděna jako příklad kvalitního a ověřeného kódu, odhalena chyba, kterou si statické analyzátory nevšimly, při použití prvku struktury „s->keepon“, který měl číselný typ, ale byl porovnáván s logickou hodnotou TRUE. V kódu OpenSSL, kromě výše zmíněného problému s „(s1 == NULL) ∧ (s2 == NULL)“, byly také odhaleny anomálie ve výrazech „(-2 == rv)“ (mínus byl překlep) a „BIO_puts(bp, „:”)“.
Zdroj: opennet.ru
