2023-9-7讨论班

Type Batched Program Reduction

Reducer:将程序变得更简洁,但保留感兴趣的点(例如编译错误,运行错误,特定输出等),不需要程序语义和原来保持一样

  • 针对特定的语言

Reduction算法:

  • transformation:程序化简的方法
  • search strategy:指导程序如何化简【一般是贪心】
  • Oracle:如何判断程序仍然具备想要的性质【一般是用户给的】

举例:C-Reduce

  • 将特定字符串替换为”0”/“1”
  • 局部修改:修改三目运算=>例如只保留一个分支,reduce只需要让程序变简单
  • 删除指定行数的代码
  • 进行类编译器的修改:例如使用clang的前端

举例:Perses

  • 在程序的解析树上从根节点开始遍历尝试删除节点
  • 并不能考虑某个特定语言的特征

本文工作

  • Type Batched

    • 根据解析树的结点类型删除一个节点

      为什么要这样?因为删除某种类型的节点可能会导致出错概率提升从而拖慢效率

    • type顺序的选择:计算跑oracle的期望(如果删掉能省更多的检查次数,那就先删这个),概率则是先验给出来的

  • Joint Batched

    • 由于同一类型的点可能相互有关系,因此这种策略会把某种节点全删,如果删完后oracle失败,则会更新概率,重新计算期望以重做joint(这里我感觉是重做type?因为更新了这种type的期望)

JVM testing

Java Runtime Machine,执行java字节码,由于JVM的复杂性,因此对其做测试和保证其正确性时重要的

用fuzz的方式对其做测试

  • 生成不同的输入
  • 差分测试,看在不同的JVM实现上结果有什么不一样

JavaTailor

  • Synthesis-based generation,随机将JVM bug case(过去的bug,现在可能已经被修复了)的代码剪切然后拼接,修复可能的语法错误(Synthesis),执行代码
    • 但是随机选取可能效率比较低,因为代码段的特征可能会相似,diversity不够好

Vectorizing Program Ingredients for Better JVM Testing(ISSTA’23)

  • 代码段语义层次聚类(hierarchy clustering)

JITfuzz: Coverage-guided Fuzzing for JVM Just-in-Time Compilers

针对JVM的设计理念来做fuzz

JIT可以做一些优化,例如函数的内联优化,小代码的优化(e.g. x/2 => x<<1),聚合类型的标量优化(例如把struct用可以开在栈上的int啥的代替)

  • 目前没什么针对JIT的测试,大多都是针对JVM的

  • 做的方法和测试C compiler的差不多,mutation based fuzzing

    不是 mutation testing,那个是将错误代码插入到被测代码中,以验证当前测试用例是否可以发现注入的错误。

  • 六个mutator

    • function inlining:将x op y这样的代码替换为调用小函数以触发JIT的inline检查
    • simplification:将代码弄复杂
    • ……