代码审查是电子设计中软件开发生命周期的重要组成部分,使用成熟的编码标准(例如MISRA或CERT)对于确保所生成代码的质量至关重要。
编码标准指南吸收了许多人的专业知识,并且它们的使用大大降低了错误的可能性。如果答案是直接的“是”或“否”,则准则可能是可决定的,或者答案是“是”,“否”或“可能”时,标准可能是不确定的。
为了使代码审查自动化,在开发过程中使用行业标准化的静态代码分析器非常重要。但是,即使使用最好的静态代码分析器,也可能会报告大量错误,尤其是在项目开始时或添加新模块时。这些缺陷可能是真实的,也可能不是。
复杂的数据流算法通常是执行静态分析中强制执行不确定规则所必需的语义分析所必需的。但是,由于这些算法的复杂性,以及性能和精度之间的平衡,可能会误报。随之而来的问题是:算法应该运行到数小时才能完成吗?
误报是开发人员给出的不使用静态代码分析工具的主要原因之一。鉴定和审查静态分析结果可能会很耗时,尤其是在违反不确定的准则的情况下。
将机器学习引入静态代码分析中可以帮助检测可能导致误报的代码结构。这使分析更加准确,并减少了审核所需的时间。将机器学习与静态分析配对时,可以考虑以下几种可能的策略:
分组/集群
最初的策略是将性质相似的缺陷分组,以便可以一起解决。这需要定义和计算相似性度量。该度量可以基于缺陷或元素的标识,例如缺陷内发现的功能或变量。
一些静态分析器为每个缺陷分配严重性级别,这使他们能够将性质相似但在同一级别的缺陷归为一组。缺陷也可以根据它们是否可能产生误报进行分组。将缺陷分配到适当的级别取决于静态代码分析器开发人员的解释。但是,这可能无法保证与组中的每个缺陷都有真正的关系。
可以通过使用无监督机器学习聚类算法(例如“ K-Means”聚类算法)来增强此策略。这是最简单的无监督学习算法,可自动对缺陷进行分组,其思想是定义“ K”个中心,每个集群一个。该算法将迭代计算聚类的中心。例如,如果两个缺陷具有相同的源或控制流,则它们在直观上可能相似,因为这些缺陷采用共同的路径。换句话说,两个缺陷所具有的共同点越多,缺陷就越相似,并且对其进行检查的速度也会越快。
排行
这种机器学习策略确定缺陷为真实肯定的可能性,并相应地对它们进行排名。静态分析基于代码的语法和语义分析。语法分析的结果通常是非常可靠的,因为算法是可以确定的。但是,句法分析无法识别复杂的缺陷,因此需要进行语义分析。
如前所述,通过将数据流算法与语义分析结合使用,可以识别复杂的缺陷,但由于结果不确定,因此更有可能导致误报。这些复杂的缺陷可能涉及近似值。(应注意,数据流算法还采用了其他技术,这些技术不太容易出现误报。例如,Barcelogic和Yices等SMT(可满足性模理论)求解器。)
结论
结合使用所描述的策略,机器学习在用于后处理分析结果报告时可以改善静态分析工具的结果。单独或一起应用聚类和排序将减少用户检查缺陷所需的工作,从而提高开发环境中的效率并采用静态分析。