Daikon 2001 paper

  程序不变量推断工具

Posted by Xiaoran on February 7, 2018

这篇paper的完整题目是 Dynamically Discovering Likely Program Invariants to Support Program Evolution

下载链接

注:本文标题中的序号表示这段内容出现在paper中的某个section(比如 “2、例子” 对应 paper 中的 section 2 )

Daicon的出现背景

  • 在software evolution过程中,invariants防止重要的assumptions被更改
  • 但是,explicit invariants太缺乏了,所以程序员很容易引入bug
  • 一个解决方法就是动态的、自动化的推断invariant

Daicon的原理

  • 使用一组输入值,执行(instrumented)程序
  • 从执行的程序中截取variable trace(存入data trace database)
  • 从variable trace中推断invariants


Daicon与test data的关系

  • Daicon算法的精度取决于test case的质量与完整度
  • 额外的test case可能会提高invariant的精度

如何用program trace获得invariant?

  • 如何发现invariant?
  • 运行速度?
  • 如何选择test case?
  • 如何减少(对程序员来说)无用的invariant?

2、例子:使用规范良好的程序展示Daicon的功能

  • 规范良好:展示且服从preconditions, postconditions, loop invariants
  • Daicon可以找到所有的目标invariants,外加
    • 原程序未明确定义的invariant
      • 可以发现原定义的不足
    • 受限于test case的invariant
      • size(Array) < 30
    • 正确却无聊的invariant(trivial解)
  • 填补了static分析的不足
    • static会因为信息不足导致结论不完整
    • static无法良好的分析pointer指向的heap

3、推断invariants

  • 需解决的两大问题:
    • 推断哪些invariant?
    • 怎样推断?
  • Daicon的三个推断点:entry, exit, (optional) loop head
  • 每次执行到推断点的时候,instrumented program都会把变量的值给Daicon
  • Daicon检查所有可能的invatiant:x = const, a > b, y = f(x), etc.
  • 只要invariant被违反一次,那么这个invariant在之后的程序都不会再检查了(别的invariant会继续检查)
    • 检查的invariant越多,Daicon运行的越慢
  • 只支持有限的数据结构
    • scalar number (num + character + boolean)
    • sequence of scalars (array)

3.1 Invariant Confidence

  • 如果输入集太少,那么输出的invatiant就会又多又无用
    • 理想状况是有“完整”的输入集
    • Daicon选择计算Invariant Confidence
      • 使用统计推断
      • test if noncoincidental,之后report
      • 有些invatiant可能只出现在loop,不出现在entry和exit,因为执行的次数不够多

3.2 Derived Variables

  • 显式的variable可能不够,所以Daicon自行推导一些variable
    • array长度,内部元素范围
    • 某variable的极值
    • func被call的次数
  • 没写怎么生成的

7、Test suites for Daikon

  • 随机 test-case generation
    • 很好的展示invalid inputs
  • hand-crafted test cases
    • 其实就是人工合成

8、程序instrumentation

8.1 获取variable值的过程

  • 先对程序进行instrumentation
  • 在每一个推断点记录所有variable的值
    • 对于C语言,同时记录pointer的地址值和引用值
  • 讲这些值存入data trace file

8.2 instrumentation的过程

  • 解析(parse)程序到一个abstract syntax tree
  • 分析所有variable的scope
  • 添加代码
    • 保存variable的值到指定地点
  • 重新compile程序

缺点

  • 不支持object-oriented programming

改进

  • 测试用例:regression testing
  • test suite augmentation