一句话:提出条件线性递推式在最终周期情形下的闭式解,并实现生成-验证求解器以验证含条件分支循环。
循环的程序验证常把循环转换为递推式并求闭式解,但现有求解器难以处理循环体含条件语句时产生的条件表达式。本文研究条件线性递推式,证明若由给定初值生成的索引序列是最终周期的,则该递推式具有闭式解;同时指出判定最终周期性是不可判定的,于是提出启发式“生成-验证”算法,在检查最终周期性的同时计算闭式解。作者实现了求解器,并在其基础上用 SMT 求解器 Z3 构建直接的程序验证器。实验表明,它能有效验证许多循环中含条件语句的基准程序,且优于其他基于递推的验证工具。最后还讨论了初值未知时闭式解的扩展。
In program verification, one method for reasoning about loops is to convert them into sets of recurrences, and then try to solve these recurrences by computing their closed-form solutions. While there are solvers for computing closed-form solutions to these recurrences, their capabilities are limited when the recurrences have conditional expressions, which arise when the body of a loop contains conditional statements. In this paper, we take a step towards solving these recurrences. Specifically, we consider what we call conditional linear recurrences and show that given such a recurrence and an initial value, if the index sequence generated by the recurrence on the initial value is what we call ultimately periodic, then it has a closed-form solution. However, checking whether such a sequence is ultimately periodic is undecidable so we propose a heuristic "generate and verify" algorithm for checking the ultimate periodicity of the sequence and computing closed-form solutions at the same time. We implemented a solver based on this algorithm, and our experiments show that a straightforward program verifier based on our solver and using the SMT solver Z3 is effective in verifying properties of many benchmark programs that contain conditional statements in their loops, and compares favorably to other recurrence-based verification tools. Finally, we also consider extending our results to computing closed-form solutions of recurrences with unknown initial values.
@article{paperbot2019,
title = {Solving Conditional Linear Recurrences for Program Verification: The Periodic Case},
author = {Chenglin Wang and Fangzhen Lin},
journal = {Proceedings of the ACM on Programming Languages},
volume = {7},
number = {OOPSLA1},
year = {2023},
doi = {10.1145/3586028}
}