英特尔开放ControlFlag机器学习系统代码以识别代码中的错误

英特尔发现了与 ControlFlag 研究项目相关的进展,旨在创建机器学习系统以提高代码质量。 该项目准备的工具包允许基于大量现有代码训练的模型,检测用C/C++等高级语言编写的源文本中的各种错误和异常。 该系统适用于识别代码中的各种问题,从检测拼写错误和不正确的类型组合,到检测指针中遗漏的 NULL 检查和内存问题。 ControlFlag 代码是用 C++ 编写的,并且在 MIT 许可证下开源。

该系统通过对 GitHub 和类似公共存储库中发布的开放项目的现有代码数组构建统计模型来进行自学习。 在学习阶段,系统确定在代码中构建结构的典型模式,并构建这些模式之间链接的语法树,这反映了程序中的代码执行流程。 结果,形成了一个参考决策树,它结合了开发所有分析的源文本的经验。

正在测试的代码会经历类似的识别模式的过程,并根据参考决策树进行检查。 与相邻分支的较大差异表明正在检查的模板中存在异常。 该系统不仅可以识别模板中的错误,还可以提出纠正建议。 例如,在OpenSSL代码中,发现了构造“(s1 == NULL) ∧ (s2 == NULL)”,该构造在语法树中只出现了8次,而最近的分支值为“(s1 ==空)|| (s2 == NULL)”发生了大约 7 次。 系统还检测到异常“(s1 == NULL) | (s2 == NULL)”在树中出现了 32 次。

英特尔开放ControlFlag机器学习系统代码以识别代码中的错误

解析代码片段“if (x = 7) y = x;”时系统判断“if”语句中通常使用“variable == number”结构来比较数值,因此,“if”表达式中的“variable = number”很有可能是由以下原因引起的:一个错字。 传统的静态分析器也会捕获这样的错误,但与它们不同的是,ControlFlag 不使用难以预见所有可能选项的现成规则,而是基于大量使用各种构造的统计数据。项目。

作为一个实验,在 cURL 实用程序的源代码中使用 ControlFlag(经常被引用为高质量和经过验证的代码的示例),在使用“s->keepon”结构元素时检测到静态分析器未注意到的错误,它具有数字类型,但与布尔值 TRUE 进行比较。 在OpenSSL代码中,除了上述“(s1 == NULL)∧(s2 == NULL)”的问题外,表达式“(-2 == rv)”也存在异常(减号是拼写错误) )和“BIO_puts(bp,“:”)

来源: opennet.ru

添加评论