自动运行时检查
自动运行时检查
自动运行时检查
应对 “死局”:程序员的自救
我们可以在运行时检查一切明确的 Specification!
AA/ABBA 型死锁
数据竞争
带符号整数溢出 (undefined behavior)
Use after free
……
动态程序分析
:状态机执行历史的一个函数
f
(
τ
)
f(\tau)
f
(
τ
)
付出程序执行变慢的代价
找到更多 bugs
自动运行时检查
运行时 Lock Ordering 检查
一个想法
为每一个 acquire/release 记录 tid 和 lock name
Assert:
G
(
V
,
E
)
G(V, E)
G
(
V
,
E
)
无成环
V
V
V
: 所有的 lock names
E
E
E
: 每当观测到持有
u
u
u
时获取
v
v
v
就把
(
u
,
v
)
(u, v)
(
u
,
v
)
加入
E
E
E
T1 ACQ a T1 ACQ b T1 REL b T2 ACQ b T2 REL b ...
自动运行时检查
Linux Kernel Lockdep
解决锁的 “命名” 问题
可以是锁的地址
也可以是锁的初始化位置 (更严格;开销更小)
The kernel lock validator
Since Linux Kernel 2.6.17, also in
OpenHarmony
v1
我们有一个山寨实现!
自动运行时检查
ThreadSanitizer: 运行时的数据竞争检查
基本想法
同时发生在不同线程、同一变量、至少一个是写操作
但 T1: load(x); T1: t = t + 1; T2: store(x); 依然是数据竞争
对于发生在不同线程且至少有一个是写的
x
,
y
x,y
x
,
y
检查
x
≺
y
∨
y
≺
x
x \prec y \lor y \prec x
x
≺
y
∨
y
≺
x
“Happens-before race”
实现:Lamport's Vector Clock:
Time, clocks, and the ordering of events in a distributed system
自动运行时检查
应对死局:Sanitizers
现代复杂软件系统必备的支撑工具
AddressSanitizer
(asan);
(paper)
: 非法内存访问
Buffer (heap/stack/global) overflow, use-after-free, use-after-return, double-free, ...;
没有
KASAN
, Linux Kernel 的质量/安全性直接崩盘
ThreadSanitizer
(tsan): 数据竞争
KCSAN:
Concurrency bugs should fear the big bad data-race detector
MemorySanitizer
(msan),
UBSanitizer
(ubsan), ...
SpecSanitizer: 基于 AI/LLM 的 “specification 检查”
就等你来开发了