跳转到内容

软件工程/质量/静态分析简介

来自维基教科书,开放世界中的开放书籍

静态程序分析是指在不实际执行由该软件构建的程序的情况下对计算机软件进行的分析(对正在执行的程序进行的分析称为动态分析)。在大多数情况下,分析是在源代码的某个版本上进行的,而在其他情况下,则是在目标代码的某种形式上进行的。该术语通常应用于由自动化工具执行的分析,而人工分析被称为程序理解、程序认知或代码审查。

工具执行的分析复杂程度各不相同,从仅考虑单个语句和声明的行为,到在分析中包含程序的完整源代码。从分析中获得的信息的使用范围从突出显示可能的编码错误(例如 lint 工具)到形式化方法,这些方法在数学上证明了关于给定程序的属性(例如,其行为与规范匹配)。

可以说,软件度量和逆向工程是静态分析的形式。

静态分析在商业上的一个越来越多的应用是在验证安全关键计算机系统中使用的软件的属性,以及定位可能存在漏洞的代码。例如,医疗软件越来越复杂,美国食品药品监督管理局(FDA)已将使用静态代码分析作为提高软件质量的一种手段[1]

形式化方法

[编辑 | 编辑源代码]

形式化方法是应用于软件(和硬件)分析的术语,其结果完全通过使用严格的数学方法获得。使用的数学技术包括指称语义、公理语义、操作语义和抽象解释。

已证明,除了程序状态空间是有限的假设之外,查找所有可能的运行时错误,或者更一般地说,任何形式的违反程序最终结果规范的现象,都是不可判定的:不存在可以始终如一地正确回答给定程序是否可能或不可能出现运行时错误的机械方法。这一结果可以追溯到 1930 年代丘奇、库尔特·哥德尔和图灵的工作(见停机问题和 Rice 定理)。与大多数[需要引用]不可判定问题一样,人们仍然可以尝试给出有用的近似解。

形式化静态分析的一些实现技术包括

  • 模型检验考虑具有有限状态或可以通过抽象简化为有限状态的系统;
  • 数据流分析是一种基于格子的技术,用于收集有关可能值的集合的信息;
  • 抽象解释模拟每个语句对抽象机器状态的影响(即它基于每个语句和声明的数学属性来“执行”软件)。这种抽象机器过拟合了系统的行为:因此,抽象系统变得更易于分析,但以不完整性为代价(并非原始系统的所有属性都对抽象系统成立)。但是,如果执行得当,抽象解释是可靠的(抽象系统的每个属性都可以映射到原始系统的真实属性)[2]。Frama-c 框架和 Polyspace 很大程度上依赖于抽象解释。
  • 正如 Hoare 逻辑首先建议的那样,在程序代码中使用断言。有些编程语言有工具支持(例如,SPARK 编程语言(Ada 的一个子集)和 Java 建模语言 - JML - 使用 ESC/Java 和 ESC/Java2,以及 C 语言的 ANSI/ISO C 规范语言)。

参考资料

[编辑 | 编辑源代码]
  1. FDA (2010-09-08). "FDA 的输液泵软件安全研究". 食品药品监督管理局. 检索于 2010-09-09.
  2. Jones, Paul (2010-02-09). "一种基于形式化方法的医疗设备软件分析验证方法". 嵌入式系统设计. 检索于 2010-09-09.

参考书目

[编辑 | 编辑源代码]
[编辑 | 编辑源代码]
华夏公益教科书