跳转至

软件分析与验证

清华大学软件学院,2023年春季学期。

程序漏洞

心跳流血漏洞:OpenSSL 在执行 heartbeat 的 echo 指令的时候没有进行边界检查,可能会导致隐私泄露

  • 1996, 欧洲阿丽亚娜5型火箭发射失败
  • 2000-2010, 丰田“加速门”事件
  • 2012, Knight Capital 在30分钟内损失4.4亿美元
  • 2016, the DAO 智能合约被攻击,损失6000万美元

课程主要内容

程序的行为是否符合预期?

二分查找

(low+high)/2 的溢出

Hint

正确的算法实现的代码也不一定正确

程序验证

以一种数学的、严格的方式证明或证伪程序满足给定的规约

\[ 程序 \models 规约 \]

程序验证能够提供最高程度(数学)的正确性保证

历史

[Floyd 1967] Assigning meaning to programs: program is proved correct by reasoning about assertation

  • Connecting the logic and the program

[Hoare, 1969] An axiomatic basis for computer programming: Hoare Triple, Hoare Logic

[Dijkstra, 1976] Guarded commands, non-determinacy and formal derivation of programs

  • \(P \Rightarrow wp(S, Q)\)
  • Predicate transformer

Rice Theorem(H.G. Rice, 1953)

递归可枚举语言的所有非平凡性质都是不可判定的。

程序验证的内容

传统程序验证:需要用户提供断言,需要用户进行问题分解,难以自动化

自动程序验证:

  • 如何刻画程序规约?
  • 如何理解程序行为?
  • 如何进行自动推理?

验证器:

  • 输入:程序+规约
  • 输出:是/证明;否/反例

Notes

希望算法对于我们遇到的大部分情况都能够使用

课程内容设计

数理逻辑 → 判定过程 → 程序验证

  • 数理逻辑:基于程序特点对一阶逻辑进行限制
  • 判定过程:逻辑系统中的计算问题
  • 程序验证:基于逻辑理解程序的行为和语义