一句话:提出依赖来源证据与边界证据的静态分析,在安全证明失败时主动寻找可触发线索以抑制除零误报。
除零是常见编程错误,但传统静态分析在无法证明除数在所有执行中非零时就报告缺陷,因而误报严重:在大量欠约束变量上推理程序语义时,除数的取值范围被显著放宽,安全证明容易失败,导致海量误报。本文基于对已知除零缺陷的广泛实证研究,提出不再在安全验证失败时武断报警,而是主动寻找肯定性证据,即来源证据(source evidence)与边界证据(bound evidence),用以表明该缺陷在运行时被触发的可能性很高。作者实现了工具 Wit,并在 Linux 内核等真实软件上评估,共发现 72 个新的除零缺陷,误报率低至 22%,表明该证据驱动策略能在保持较强发现能力的同时显著提升检测精度。
The static detection of divide-by-zero, a common programming error, is particularly prone to false positives because conventional static analysis reports a divide-by-zero bug whenever it cannot prove the safety property --- the divisor variable is not zero in all executions. When reasoning the program semantics over a large number of under-constrained variables, conventional static analyses significantly loose the bounds of divisor variables, which easily fails the safety proof and leads to a massive number of false positives. We propose a static analysis to detect divide-by-zero bugs taking additional evidence for under-constrained variables into consideration. Based on an extensive empirical study of known divide-by-zero bugs, we no longer arbitrarily report a bug once the safety verification fails. Instead, we actively look for affirmative evidences, namely source evidence and bound evidence, that imply a high possibility of the bug to be triggerable at runtime. When applying our tool Wit to the real-world software such as the Linux kernel, we have found 72 new divide-by-zero bugs with a low false positive rate of 22%.