程序静态分析研究综述.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序静态分析研究综述 1. 测试与静态测试 长期以来,程序完全一直受到计算机和工业领域的关注。自20世纪60年代起,就有很多计算机科学家对程序验证进行了研究,提出了各种理论和方法。一般说来,程序验证要求通过推理或者穷举的手段来判定程序的行为是否符合规约。由于要涵盖所有可能情况,而程序设计语言的复杂性使得程序的复杂性随着程序尺寸的增大呈指数级增长,同时证明任一程序正确与否本身是一个不可判定问题,因此程序验证目前只用于证明一些关键的核心模块的正确性而没有得到更广泛的应用。就目前而言,程序验证方法虽然可以保证软件质量,但是往往需要有一定经验的用户花费相当多的时间,因而并不一定能提高软件的生产率。 另一方面,在现实的软件开发中大量的时间被用于发现和消除软件中的错误,也就是软件测试。除了一些大公司在大型软件系统开发中使用了一些自动测试手段,在很多情况下,软件测试仍然停留在手工测试阶段。手工测试不仅效率很低,而且容易出错。测试任务往往很繁重,在资源有限、时间紧迫的情况下测试任务常常不能充分完成。测试和调试手段的匮乏已经成为制约软件生产率和软件质量的一个瓶颈。 测试可分为动态测试和静态测试两大类。动态测试就是执行程序,再观察其行为是否满足要求。既可以由用户直接观察,也可以使用一定的辅助工具。例如,PurifyPlus等通过在程序中加入代码来动态地监视程序的运行状态。 静态测试不编译运行程序,而是通过对程序源代码进行分析以发现其中的错误。程序静态分析的目标不是证明程序完全正确,而是作为动态测试的补充,在程序运行前尽可能多地发现其中隐含的错误,提高程序的可靠性和健壮性。事实上,很多相当成熟的系统中还包含着错误。只凭测试人员手工测试很难找出这些错误,而通过静态测试则已经发现了现存系统中的很多错误。 目前关于程序静态分析的研究是软件工程研究的一个热点,也已经有一些产品面世。本文首先介绍静态分析的主要方法,然后介绍目前已经实现的几个典型系统,并对它们作一些比较,最后说明静态分析的局限以及我们的展望。 2. 静态程序分析的方法和理论 本节简要介绍在程序静态分析工具的构建中常用的方法。这些方法并不完全相互独立,一个静态分析工具常常需要使用多种方法以取得最佳效果。 2.1 约束求解算法b 符号执行的基本思想是,用抽象的符号表示程序中变量的值,来模拟程序的执行。该方法很好地克服了在静态测试时不能确定程序中变量的值的问题。符号执行常常在对路径敏感的程序分析中使用。用符号执行加约束求解进行程序分析的基本思想是:用Hoare逻辑可以将程序表示成{P}Q{R},其中P是执行程序前需要满足的条件,R是程序执行后需要满足的条件。在程序的符号执行过程中由P出发,结合程序中的约束条件,可以推导出新的约束条件c1∧c2∧…∧cn,因此有P∧c1∧c2∧…∧cn→R。可以对约束条件P∧c1∧c2∧…求解。如果有一组解满足这一约束,说明存在一组输入使运行程序的结果和规约不符。如果程序的规约正确,则程序中必定包含错误。 约束求解工具接受的约束条件的集合以及求解能力决定了分析工具发现错误的能力和效率。从理论上讲,很多约束问题是不可解的,或者虽然可解但具有指数级的时间复杂度。尽管如此,对于实际中的很多问题实例来说,高效率的约束求解工具可以在用户可接受的时间内找到解或者断定解不存在。 符号执行和约束求解方法的优点在于它可以精确地静态模拟程序的执行。由于它跟踪了变量的所有可能取值,因此能够发现程序中细微的逻辑错误。但是在处理大程序时,程序执行的可能的路径数目随着程序尺寸的增大而呈指数级增长。在这种情况下就需要对路径进行选择,选取一定数量的路径进行分析。 2.2 对象函数的协同判定 自动定理证明是基于语义的程序分析特别是程序验证中常用到的技术。但是采用消解原理的定理证明器一般并不适合于程序分析、因为它不太方便处理整数域、有理数域上的运算。在这种情况下、人们常用各种判定过程(decision procedures)来判别公式是否为定理。当然,判别的方法和公式的形式有关。对于形如t1=u1∧…∧lp=up,∧r1≠s1∧…∧rq≠sq的一组等式以及不等式的合取,判定的基本方法是首先由该合取式构造成一个图,合取式中的每一个条件对应于图中的一个结点;然后利用给出的等式将对应的li和ui(1≤i≤p)顶点合并。在顶点合并的过程中我们对合取式中的不等式进行检查,如果发现存在1≤i≤q,ri等于si,则可以导出矛盾,该合取式不可满足。 为了能够对包含数学运算以及函数的更复杂的合取式进行推导,Nelson和Oppen提出了所谓的协同判定过程(cooperating decision procedure)。该方法能处理的公式中可以有抽象函数符号以及带大于号、小于号的不等式。具体的处理方法是首先将该合取式的各

文档评论(0)

lmzwkyc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档