发布 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语言的标准模板以及检测条件“if”表达式中的异常的能力。 例如,在分析代码片段“if (x = 7) y = x;”时系统会判断“if”语句通常使用“变量==数字”结构来比较数值,因此“if”表达式中的“变量=数字”很可能是由拼写错误造成的。 该套件包含一个脚本,允许您下载 GitHub 上现有的 C 语言存储库并使用它们来构建模型。 还提供现成的模型,让您可以立即开始检查代码。

来源: opennet.ru

添加评论