Over-approximating (OX) program logics, such as separation logic, are used to verify properties of heap-manipulating programs: all terminating behaviour is characterised but the reported results and errors need not be reachable. OX function specifications are thus incompatible with true bug-finding supported by symbolic execution tools such as Pulse and Gillian. In contrast, under-approximating (UX) program logics, such as incorrectness separation logic, are used to find true results and bugs: reported results and errors are reachable, but not all behaviour can be characterised. UX function specifications thus cannot capture full verification. We introduce exact separation logic (ESL), which provides fully verified function specifications compatible with true bug finding: all terminating behaviour is characterised, and all reported results and errors are reachable. ESL requires subtle definitions of internal and external function specifications compared with the familiar definitions of OX logics. It supports reasoning about mutually recursive functions and non-termination. We prove frame-preserving soundness for ESL, demonstrating, for the first time, functional compositionality for a non-OX program logic. We investigate the expressivity of ESL and the role of abstraction in UX reasoning by verifying abstract ESL specifications of list algorithms. To show overall viability of exact verification for true bug-finding, we formalise a compositional symbolic execution semantics capable of using ESL specifications and characterise the conditions that these specifications must respect so that true bug-finding is preserved.
翻译:超超控制( OX) 程序逻辑, 如分解逻辑, 用于核查 堆积管理程序 的特性: 所有终止行为都有特征, 但报告的结果和错误都无法达到。 因此, OX 函数的规格与像 Pulse 和 Gillian 这样的象征性执行工具所支持的真正错误调查不相容。 相反, 超控制( UX) 程序逻辑, 如不正确分离逻辑, 被用来寻找真实的结果和错误: 所报告的结果和错误是可以达到的, 但不是所有的行为都能被定性的。 UX 函数的规格因此无法捕捉完全的核查。 我们引入精确的分解逻辑( ESL ), 提供与真错误发现相符的完全核实性功能。 ESX 的功能性规范( ESX ) 的精确性( ESL ), 与熟悉的逻辑定义相比, 低控制( UX ) 的逻辑, 它支持关于相互递解的函数和非解析的逻辑的推理。 我们证明 ESL 保持框架的正确性, 第一次证明, 用于不精确执行不精确的 ESX 的精确的精确性 逻辑 。