![](https://oss-emcsprod-public.modb.pro/pdf/019b58da-ac78-478d-b915-31ec3424f16c/bg2.jpg)
1244
Journal of Software 软件学报 Vol.31, No.5, May 2020
目前,软件缺陷(和漏洞)的检测方法主要分为两大类:静态分析和动态测试.不同于动态测试需要实际运行
被测程序,静态分析是指在不运行代码的情况下对程序代码进行系统的分析.不同于动态测试受限于测试用例
的完备性,静态分析可以比较全面地考虑可能的执行路径,能发现更多的缺陷,是当前被学术界和工业界普遍采
用的技术.
在实际应用中,静态分析的结果往往包含大量的误报,导致大量的人工确认工作,耗时且容易出错.为提高
分析的精度,往往需要执行高复杂度的静态分析,例如上下文敏感的过程间分析、流敏感/路径敏感的分析等.然
而,高复杂度的分析必然导致极大的计算量和内存消耗,例如在过程调用上下文敏感的分析中,上下文数量会随
目标程序的大小成指数级增长,一个中等规模的软件就可能包含上百万个不同的调用上下文
[1]
.其次,在开源软
件生态下,软件系统的规模急剧增长,百万行、千万行甚至更大的代码规模越来越常见
[2]
.
对此,多年来,人们在静态分析优化方面做了大量的研究工作,取得了不少的进步.传统的优化研究主要关
注对顺序算法的优化,但随着摩尔定律的失效,单核计算效率的提升不足,顺序算法分析效率相对低下.而随着
多核、众核架构的兴起,并行化计算成为有效解决计算效率瓶颈的关键,各种并行化的分析算法被提出,更进一
步地提高了分析的效率.
本文主要通过调研静态程序分析并行化方面的最新研究进展以及具有代表性的静态分析工具,简要综述
静态分析并行化方面的研究动态,同时根据调研内容,讨论在静态分析并行化方面的未来可能的研究方向.本文
第 1 节介绍静态分析的基本概念和关键技术.第 2 节简要讨论当前静态分析面临的挑战.传统算法优化研究及
其不足将在第 3 节详细讨论.第 4 节和第 5 节重点介绍并行/分布式静态分析研究以及并行静态分析工具.第 6
节讨论未来可以开展的研究.第 7 节对本文进行总结.
1 静态程序分析简介
程序分析指的是对计算机程序进行人工或自动化的分析,以确认或发现其特性,比如性能、正确性、安全
性等,是否符合预期
[3]
.程序分析的历史几乎与程序的历史一样长,自从有了程序就有了程序分析.最初的分析主
要是人工进行的,但人工分析往往需要消耗大量的时间和精力,因此,后来人们越来越多地关注自动分析.其中,
编译技术的发展大大带动了程序的自动分析技术,目前的许多分析技术都可以在编译技术中找到基本雏形
[4]
.
以分析过程“是否需要运行被测程序”为准,可将程序分析划分为两大类:静态分析和动态测试.静态分析是
指在不运行代码的方式下进行的分析,动态测试则通过运行具体程序并获取程序的输出或内部状态等信息来
验证或发现程序性质.一般来说,动态测试由于获取了具体的运行信息,因此报出的缺陷更为准确,但只能对有
限的测试用例进行检查;而静态分析可以比较全面地考虑可能的执行路径,能够发现更多的缺陷.本文主要关注
于静态分析.除了缺陷检测以外,静态分析还可用于程序理解、修复以及测试用例生成等方面,是程序语言和软
件工程领域的一个重要研究方向
[5]
.
静态分析涉及的基础理论包括抽象解释(abstract interpretation)、约束求解等,而关键技术包括数据流分析、
指针分析、符号执行(symbolic execution)等.下面将进行简要介绍.此外,人们在发展出众多静态分析技术的同
时,也开发了许多高效的静态分析工具,例如被广泛使用的商业静态分析工具 Coverity
[6]
、Fortify
[7]
、Klocwork
[8]
等,而且这些工具往往综合运用多种分析技术,这也是当前程序分析发展的一个趋势——各种分析技术的集成
与融合.图 1 是一些关键的静态分析技术和工具的时间线.
1) 抽象解释
程序的抽象解释
[12,17]
就是使用抽象对象域上的计算逼近程序指称的对象域(具体对象域)上的计算,使得程
序抽象执行的结果能够反映出其真实运行的部分信息.抽象解释本质上是一种为在计算效率和计算精度之间
取得均衡,以损失计算精度求得计算可行性,再通过迭代计算增强计算精度的抽象逼近方法.基于抽象解释的代
表性程序分析工具包括 Frama-C Value Analysis
[18]
、Astrée
[19]
等.
2) 数据流分析
数据流分析试图获取不同程序点上相关数据的流动信息
[20]
,它对程序控制流图(control flow graph,简称
评论