[论文解读] Inferring Concise Specifications of APIs
本文提出了一种新颖的技术,通过转换最强后置条件(SP)谓词变换器生成的指数级庞大公式,推断出简洁、人类可读的Java API方法后置条件。通过利用SP输出中的结构模式,该方法在证明长度上减少76.7%,在验证器运行时间上减少26.7%,在七个库的2,300多个方法上实现了75.7%的成功率,其中84.6%的规格说明在20行以内。
Modern software relies on libraries and uses them via application programming interfaces (APIs). Correct API usage as well as many software engineering tasks are enabled when APIs have formal specifications. In this work, we analyze the implementation of each method in an API to infer a formal postcondition. Conventional wisdom is that, if one has preconditions, then one can use the strongest postcondition predicate transformer (SP) to infer postconditions. However, SP yields postconditions that are exponentially large, which makes them difficult to use, either by humans or by tools. Our key idea is an algorithm that converts such exponentially large specifications into a form that is more concise and thus more usable. This is done by leveraging the structure of the specifications that result from the use of SP. We applied our technique to infer postconditions for over 2,300 methods in seven popular Java libraries. Our technique was able to infer specifications for 75.7% of these methods, each of which was verified using an Extended Static Checker. We also found that 84.6% of resulting specifications were less than 1/4 page (20 lines) in length. Our technique was able to reduce the length of SMT proofs needed for verifying implementations by 76.7% and reduced prover execution time by 26.7%.
研究动机与目标
- 为解决生成简洁、可用的正式后置条件以用于API方法的挑战,此类后置条件对形式化验证和软件工程任务至关重要。
- 克服最强后置条件(SP)公式中指数级膨胀的问题,该问题使公式在人类理解和工具使用中变得不切实际。
- 开发一种方法,将SP生成的公式转换为紧凑、可读且语义等价的规格说明,同时不损失精度。
- 使用形式化验证评估推断后置条件在真实世界Java库中的实用性和有效性。
- 识别并消除阻碍真实世界规格说明可用性的冗余、重言式或不可满足的子句。
提出的方法
- 该方法结合前向符号执行与最强后置条件(SP)谓词变换器,从方法体生成初始逻辑公式。
- 对SP生成的公式应用一系列优化规则,利用诸如互斥条件分支和公共子表达式等结构模式以减少冗余。
- 该方法采用可插拔的等价关系(∼)识别并合并语义相同的表达式,实现超越分支级别的全局简化。
- 集成框架公理和纯净性/可分配子句,以在最小化冗长度的同时保留内存安全语义。
- 该技术作为OpenJML的扩展实现,使用Z3作为SMT求解器以验证推断的规格说明。
- 该工具Strongarm系统性地应用这些优化,生成紧凑、人类可读的JML风格规格说明。
实验结果
研究问题
- RQ1SP生成的后置条件能否系统性地简化为简洁、可用的规格说明,同时不损失语义准确性?
- RQ2SP公式中的结构模式在多大程度上可被利用以减少规格说明大小并提高可读性?
- RQ3所提出的优化技术在真实世界API方法中减少证明大小和验证器执行时间方面的有效性如何?
- RQ4该方法能成功指定多大比例的真实世界API方法?生成的规格说明有多简洁?
- RQ5与常见的反模式(如重言式、冗余和不可满足的前提条件)相比,开发者对推断规格说明的可用性感知如何?
主要发现
- 该技术成功为七个流行Java库中2,300多个方法中的75.7%推断出后置条件,所有推断结果均通过OpenJML的扩展静态检查器验证为正确。
- 84.6%的推断后置条件长度小于1/4页(20行),表明其具有高度简洁性。
- 该方法使验证所需的SMT证明长度减少了76.7%,显著提升了可扩展性。
- 验证器执行时间平均减少了26.7%,证明了对下游工具性能的改进。
- 所有推断的规格说明均包含纯净性或可分配子句,表明对内存安全建模提供了强有力支持。
- 开发者调查确认,与常见反模式相比,该技术生成的简洁、无冗余、无重言式的规格说明更受青睐。
更好的研究,从现在开始
从论文设计到论文写作,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。