动态程序分析

通用 (固定) bug 模式的自动检查

  • ABBA 型死锁
  • 数据竞争
  • 带符号整数溢出 (undefined behavior)
  • Use after free
  • ……

动态程序分析:状态机执行历史的一个函数 $f(\tau)$

  • 付出程序执行变慢的代价
  • 找到更多 bugs

Lockdep: 运行时 Lock Ordering 检查

Lockdep 规约 (Specification)

  • 为每一个锁确定唯一的 “allocation site”
    • assert: 同一个 allocation site 的锁存在全局唯一的上锁顺序

检查方法:printf

  • 记录所有观察到的上锁顺序,例如 $$[x, y, z] \Rightarrow x \to y, x \to z, y \to z$$
  • 检查是否存在 $x \rightsquigarrow y \land y \rightsquigarrow x$
    • 我们有一个 “山寨版” 的例子

Lockdep 的实现

ThreadSanitizer: 运行时的数据竞争检查

并发程序的执行 trace

  • 内存读写指令 (load/store)
  • 同步函数调用
  • Happens-before: program order 和 release acquire 的传递闭包

对于发生在不同线程且至少有一个是写的 $x,y$ 检查 $$x \prec y \lor y \prec x$$

更多的 Sanitizers

现代复杂软件系统必备的支撑工具

  • AddressSanitizer (asan); (paper): 非法内存访问
    • Buffer (heap/stack/global) overflow, use-after-free, use-after-return, double-free, ...
    • Linux Kernel 也有 kasan
  • ThreadSanitizer (tsan): 数据竞争
  • MemorySanitizer (msan): 未初始化的读取
  • UBSanitizer (ubsan): undefined behavior
    • Misaligned pointer, signed integer overflow, ...
    • Kernel 会带着 -fwrapv 编译
  • IntelliSanitize
    • 等你开发