CN112119423A - 形式化验证的系统和方法 - Google Patents
形式化验证的系统和方法 Download PDFInfo
- Publication number
- CN112119423A CN112119423A CN201880087842.1A CN201880087842A CN112119423A CN 112119423 A CN112119423 A CN 112119423A CN 201880087842 A CN201880087842 A CN 201880087842A CN 112119423 A CN112119423 A CN 112119423A
- Authority
- CN
- China
- Prior art keywords
- interface
- overlay
- parameterized
- verifying
- program module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 65
- 238000012795 verification Methods 0.000 title abstract description 20
- 238000010200 validation analysis Methods 0.000 claims abstract description 9
- 238000004088 simulation Methods 0.000 claims description 55
- 238000013507 mapping Methods 0.000 claims description 17
- 230000009471 action Effects 0.000 claims description 16
- 230000007613 environmental effect Effects 0.000 claims description 15
- 238000007670 refining Methods 0.000 abstract 1
- 239000010410 layer Substances 0.000 description 171
- 230000015654 memory Effects 0.000 description 65
- 230000006870 function Effects 0.000 description 34
- 230000006399 behavior Effects 0.000 description 19
- 230000007704 transition Effects 0.000 description 15
- 230000001419 dependent effect Effects 0.000 description 7
- 230000006872 improvement Effects 0.000 description 6
- 230000008569 process Effects 0.000 description 6
- 238000012546 transfer Methods 0.000 description 6
- 230000008859 change Effects 0.000 description 5
- 238000013459 approach Methods 0.000 description 4
- 230000000694 effects Effects 0.000 description 4
- 239000000203 mixture Substances 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 3
- 230000007717 exclusion Effects 0.000 description 3
- 235000003642 hunger Nutrition 0.000 description 3
- 238000012545 processing Methods 0.000 description 3
- 230000000644 propagated effect Effects 0.000 description 3
- 230000037351 starvation Effects 0.000 description 3
- 230000002123 temporal effect Effects 0.000 description 3
- 230000004075 alteration Effects 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 2
- 239000012792 core layer Substances 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000011160 research Methods 0.000 description 2
- 239000000126 substance Substances 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- 208000001613 Gambling Diseases 0.000 description 1
- 241000699670 Mus sp. Species 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000001427 coherent effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 150000001875 compounds Chemical class 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 239000000835 fiber Substances 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 230000009249 intrinsic sympathomimetic activity Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000005236 sound signal Effects 0.000 description 1
- 238000009987 spinning Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 239000000758 substrate Substances 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
- 230000003827 upregulation Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
用于程序的形式化验证的系统和方法。系统和方法提供了用于并发的新的基于博弈论策略的组合语义模型,用于组合多线程和多核的并发层的一组形式化链接定理,以及支持认证的线程安全编译和链接的编译器。覆盖接口的验证可以包括确定用于在底层接口上运行的原语操作的中间策略,以及通过应用垂直和水平组合规则将中间策略细化为在覆盖接口上运行的策略。然后,可以根据并行组合规则将细化的策略与在覆盖接口上运行的兼容策略组合。当由每个策略施加的依赖条件满足由其他策略提供的保证时,策略可以是兼容的。形式化验证的系统和方法可以应用于智能合约的形式化验证。
Description
相关申请的交叉引用
本申请要求于2017年11月28日提交的法国专利申请第17/61318号的优先权,其全部内容通过引用并入本文中。
联邦政府资助的研究
本发明是在国家科学基金会授予的1521523以及美国空军科学研究办公室授予的FA8750-12-2-0293的政府支持下作出的。政府对发明有一定的权利。
背景技术
抽象层是构建大规模并发软件和硬件时使用的关键技术。由于多线程编程和多核硬件的普遍性,并发抽象层普遍存在于现代计算机系统。使用抽象层来隐藏实现细节(例如,细粒度同步)并且减少处于不同抽象级的部件之间的复杂依赖性。尽管并发抽象层具有明显的重要性,但是并没有对并发抽象层进行形式上的处理。这严重限制了基于层的技术的适用性,并且使得难以跨多个并发层扩展验证。
分布式分类账提供了并发执行的另一示例。这样的系统(例如基于区块链的数据库)使得能够以安全且透明的方式对记录进行分散管理。例如,区块链可以用作用于记录各方之间的交易的开放式分类账,并且可以由节点网络维护。这些节点可以各自维护区块链的本地副本,并且可以共同执行协议以确保在新交易被记录时本地副本彼此保持一致。区块链技术可以适合于期望高度安全性的各种应用,例如,身份管理、交易处理、医疗记录保持、物流的可追溯性等。然而,由于节点之间执行的并发性以及整个分布式分类账与实现分布式分类账的节点的硬件之间的多个抽象级,因此使区块链技术适合于这样的高价值应用的相同的特性还使得难以对这样的应用进行形式化验证。
发明内容
实施方式可以用于构建认证的并发抽象层。这些实施方式可以包括应用细粒度并发层演算(calculus)的用于并发C和汇编的程序验证器、认证的链接工具和线程安全验证的C编译器。实施方式还可以包括将这些工具应用于智能合约的验证。
实施方式可以包括一种用于覆盖接口(overlay interface)的形式化验证的方法。方法可以包括将覆盖接口建模为在底层接口上构建的多个层实现,底层接口由多个线程集参数化。方法还可以包括通过执行以下操作中的至少之一来验证覆盖接口。
第一操作可以验证到在底层接口上构建的程序的映射实现到策略的映射。在底层接口上运行共享原语的语义可以由策略来模拟。
第二操作可以验证第一程序模块根据第一模拟关系实现覆盖接口。在底层接口上构建的第二程序模块可以根据第二模拟关系来实现第一中间接口。在第一中间接口上构建的第三程序模块可以根据第三模拟关系来实现覆盖接口。第一程序模块可以是第二程序模块和第三程序模块的组合,并且第一模拟关系可以是第二模拟关系和第三模拟关系的组合。
第三操作可以验证第四程序模块根据第四模拟关系实现覆盖接口。在底层接口上构建的第五程序模块可以根据第四模拟关系来实现第二中间接口。在底层接口上构建的第六程序模块可以根据第四模拟关系来实现第三中间接口。第四程序模块可以是第五程序模块和第六程序模块的组合,并且覆盖接口可以是第二中间接口和第三中间接口的组合。
第四操作可以验证在第四中间接口上构建的第七程序模块根据第五模拟关系实现第五中间接口。第四中间接口可以由底层接口根据第六模拟关系来模拟。第七程序模块可以根据第七模拟关系来实现覆盖接口。覆盖接口可以由第五中间接口根据第八模拟关系来模拟。第五模拟关系可以是第六模拟关系、第七模拟关系和第八模拟关系的组合。
第五操作可以验证在底层接口上构建的第八程序模块实现覆盖接口。底层接口可以由第一线程集和第二线程集的并集参数化。覆盖接口可以由第一线程集和第二线程集的并集参数化。第一底层接口可以由第一线程集参数化,并且第二底层接口可以由第二线程集参数化。第一覆盖接口可以由第一线程集参数化,并且第二覆盖接口可以由第二线程集参数化。在第一底层接口上构建的第八程序模块可以实现第一覆盖接口。在第二底层接口上构建的第八程序模块可以实现第二覆盖接口。第一底层接口可以与第二底层接口兼容。第一覆盖接口可以与第二覆盖接口兼容。
第六操作可以验证由第三线程集参数化的接口与由第四线程集参数化的接口兼容。在一些方面,对于第三线程集中的所有线程,由第四线程集参数化的接口的依赖条件可以意味着由第三线程集参数化的接口的保证条件。在各个方面中,对于第四线程集中的所有线程,由第三线程集参数化的接口的依赖条件可以意味着由第四线程集参数化的接口的保证条件。由第三线程集和第四线程集的交集参数化的接口的依赖条件可以等于由第三线程集参数化的接口的依赖条件和由第四线程集参数化的接口的依赖条件的并集。由第三线程集和第四线程集的交集参数化的接口的保证条件可以等于由第三线程集参数化的接口的保证条件和由第四线程集参数化的接口的保证条件的交集。由第三线程集和第四线程集的交集参数化的接口的原语的集合等于由第三线程集参数化的接口的原语的集合和由第四线程集参数化的接口的原语的集合的组合。
实施方式可以包括一种用于覆盖接口的形式化验证的方法。方法可以包括确定在底层接口上运行第一共享原语的语义由第一策略来模拟的操作。第一策略可以将第一原语的动作描述为第一日志的第一函数。该确定可以包括构造模拟关系的证明。方法可以包括通过将第一策略与第二策略组合来生成中间并发层的操作,第二策略将底层接口上的第二共享原语的动作描述为第一日志的第二函数。方法可以包括确定中间并发层由第一覆盖层模拟的操作。
实施方式可以包括一种用于验证智能合约的方法。方法可以包括将一个或更多个智能合约建模为并发抽象层的操作。并发抽象层可以包括层实现、底层接口和覆盖接口。层实现可以包括一个或更多个智能合约。方法可以包括至少部分地通过构造与在底层接口之上运行的层实现模拟覆盖接口有关的形式化证明来验证一个或更多个智能合约的正确性的操作。
前述发明内容是作为说明而提供的,并非旨在进行限制。
附图说明
图1描绘了现代多核运行时间中的示例性并发层对象的示意图。
图2描绘了用于构建认证的并发抽象层的编程工具包。
图3描绘了用于使用锁来保护程序的临界部分的示例性代码。
图4描绘了具有两个线程(t1和t2)和调度器的示例性系统的函数调用行为。
图5描绘了使用公开的组合规则由认证的汇编层构造用于整个系统的认证的并发层。
图6描绘了策略σpull′的规范(specification),其中,r{i:v}表示使用值r更新字段i处的记录v。
图7描绘了并发层接口和并发机器模型的机器状态。
图8描绘了传送共享存储器操作的效果的L[c]的推/挽原语(push/pullprimitive)的示例性规范。
图9列出了能够用于构建和组合并发层的层演算。
图10描绘了示例性票(ticket)锁的伪代码。
图11描绘了排队锁的中间层的规范,该规范可以用于验证整个多线程排队锁的规范。
图12描绘了满足对汇编层的并行组合的要求的扩展存储器模型。
图13A至图13G描绘了根据博弈论并发框架的示例性策略。
图14A至图14D描绘了在各种线程配置中调度原语的操作。
图14E呈现了用于图2中的每个部件的行数(在Coq中)。
图14F呈现了关于实现的部件的统计中的一些。
图15描绘了根据一些实施方式的说明性区块链1500。
图16描绘了根据一些实施方式的参与用于执行智能合约的分布式计算平台的说明性节点1600。
图17描绘了根据一些实施方式的说明性并发抽象层1700。
图18描绘了根据一些实施方式的说明性物理区块链1800和说明性逻辑区块链1805。
图19示意性地描绘了可以在其上实现本公开内容的任何方面的说明性计算机19000。
具体实施方式
并发抽象层可以在具有多线程编程和多核硬件的现代计算机系统中使用。可以使用抽象层来隐藏实现细节(例如,细粒度同步)并且减少处于不同抽象级的部件之间的复杂依赖性。然而,用于并发抽象层的形式化验证的系统和方法是不充分的,限制了基于层的技术的适用性,并且使得难以跨多个并发层扩展验证。所公开的实施方式包括用于指定、组合、编译和链接认证的并发抽象层的编程工具包。所公开的实施方式提供了技术上的改进,包括用于并发性的新的基于博弈论策略的组合语义模型(及其相关联的程序验证器),用于组合多线程且多核的并发层的一组形式化链接定理,以及支持认证的线程安全的编译和链接的编译器。所公开的实施方式可以在Coq中实现,并且可以支持在C和汇编两者中的分层并发编程,但是所公开的实施方式不限于这样的实现方式和语言。还公开了具有细粒度锁定的完全认证的并发OS内核。
抽象层(例如,电路、ISA、装置驱动器、OS内核和管理程序(hypervisor))可以在现代计算机系统中使用,以帮助减少处于不同抽象级的部件之间的复杂依赖性。抽象层可以限定隐藏其底层软件或硬件部件的实现细节的接口。可以与层实现无关地仅基于接口来理解在每个层之上构建的客户端程序。这些抽象层本质上可以是并发的。其接口(除了隐藏具体的数据表示和算法细节之外)可以对于所有其方法产生原子性的错觉。例如,即使这样的方法的实现包含与其他线程进行的操作的复杂交织,但是接口的用户也会将这样的方法调用视为其在单个步骤中完成。可以使用这些原子对象的层来构造大规模并发软件系统。
作为示例性应用,可以使用本文中描述的形式化验证框架来验证智能合约。在一些实施方式中,一个或更多个智能合约可以被验证为并发抽象层。例如,并发抽象层可以包括层实现、底层接口和覆盖接口(overlay interface),其中,层实现可以包括一个或更多个智能合约。然后,可以通过构造在底层接口之上运行的层实现模拟覆盖接口的形式化证明来验证一个或更多个智能合约的正确性。
图1呈现了现代多核运行时间中的示例性并发层对象的示意图。在该示例中,箭头意指从一个部件到另一部件的可能的函数调用。部件包括线程本地(或CPU本地)对象(例如,1a至1f)、在CPU核之间共享的对象(例如,2a至2c)、在线程之间导出并共享的对象(例如,3a至3e)、以及用于线程本身的橙(例如,4a至4c)。可以在硬件层之上构造高效且无饥饿(starvation-free)的自旋锁实现2b。自旋锁可以为休眠线程队列2a和未决线程队列2c实现共享对象,该共享对象可以使用来实现线程调度器3b以及原语让步(yield)、休眠和唤醒。诸如排队锁3e、条件变量(CV)3d和消息传递原语3c的高级同步库可以在线程调度器以及原语让步、休眠和唤醒之上被实现。
跨多个并发层的形式化推理是具有挑战性的,因为不同层通常表现出不同的交织语义并且具有不同的可观察事件集。例如,图1中的自旋锁模块采取具有来自不同CPU的指令流的交叠执行的多核模型。该模型不同于用于构建高级同步库的多线程模型:如果排队锁或CV事件不可用,则每个线程将阻塞而不是旋转;并且其必须依靠其他线程来将其唤醒以确保活性。跨这些不同的抽象级的推理需要通用的、统一的组合语义模型,该模型可以覆盖所有这些并发层。该模型还必须支持可处理显式线程控制原语(例如,休眠和唤醒)的通用“并行层组合规则”。该模型还必须支持这些并发层对象的垂直组合,而同时保留可线性化属性和进度属性(例如,饥饿自由(starvation-freedom))。
所公开的实施方式包括被实现以用于构建认证的并发抽象层的完全机械化的编程工具包。该工具包可以在Coq中实现。如图2所示,该工具包可以包括以下中的一个或更多个:用于并发性的组合语义模型21,C程序验证器23和汇编程序验证器22的集合,用于构建分层细化证明的库24,基于CompCertX的线程安全验证的C编译器25,或用于组合多线程或多核层的一组认证的链接工具(例如,26a至26c)。认证的并发抽象层可以被描述为三元组(L1[A],M,L2[A])加上机械化证明对象,其示出在接口L1上代表线程集A运行的层实现M实现更抽象的接口L2。组合语义模型21可以使用博弈语义来启用本地推理,使得能够通过构建(L1[{t}],M,L2[{t}])在单个线程t上对实现进行验证。可以将在单个线程上的实现的保证通过并行组合传播到另外的线程。并发层可以实施终止敏感的上下文正确性属性。当被应用于并发抽象层时,该终止敏感的上下文正确性属性可以意指每个认证的并发对象不仅满足安全属性(例如,可线性化),还满足进度属性(例如,饥饿自由(starvation-freedom))。
某些所公开的实施方式可以为共享存储器并发抽象机器实现组合语义模型,并且启用通用并行层组合规则。可以使用这样的实施方式来指定、验证和组合处于不同抽象级的各种并发对象。可以使用所公开的实施方式来应用模拟技术,以在统一设置中验证并发对象的安全性和活性。可以使用所公开的实施方式来施加时间不变量,例如,公平性要求(对于调度器)或确定的动作(对于释放锁),实现锁原语的完整规范以及无饥饿(starvation-free)原子对象的垂直组合的支持,这均是形式化验证领域中的技术改进。
某些所公开的实施方式可以将认证的并发C层编译成汇编层。为了实现认证的多线程链接,这样的实施方式支持扩展的代数存储器模型,由此为每个线程分配的堆栈帧被组合以形成单个相干存储器。
本文中所公开的实施方式涉及共享存储器并发程序模块,其可以用于验证如图1所示的层。所公开的实施方式针对共享原语采取具有强的顺序一致性。然而,如本领域技术人员将认识到的,认证的并发层的概念可以潜在地应用于更一般的设置。本文中所公开的其他实施方式将认证的并发层的概念应用于智能合约。
1.概述
所公开的实施方式引入了形式化地指定、认证和组合这些(并发)层的基于层的方法。该方法为提供了以下问题的技术解决方案:1)解开模块依赖性和交织的复杂性,以及2)在不同部分所属的层处独立且本地地验证该不同部分。
图3描绘了用于使用锁来保护程序的临界部分的示例性代码。在该示例中,客户端程序P具有在两个不同CPU上运行的两个线程;每个线程对并发层接口L2提供的原语foo进行一次调用。接口L2由并发模块M2实现,该并发模块又被构建在接口L1之上。方法foo在受锁保护的临界部分中调用两个原语f和g。使用模块M1中的票锁算法在接口L0上实现锁。锁维护两个整数变量n(“现在送达”(“now serving”)票号)和t(即,下一票号)。锁获取方法acq取得并递增(fetch-and-increment)下一票号(以FAI_t),然后旋转直到所取得的号被提供。锁释放方法rel使“现在送达”票号以inc_n递增。这些原语由L0提供,并且被使用x86原子指令来实现。L0还提供随后被传送给L1的原语f和g以及由acq调用的无操作原语保持以宣布锁已被取走。
认证的抽象层
认证的顺序抽象层可以通过谓词加上该谓词的机械化证明对象来描述,示出了在接口L'(被称为底层接口)之上构建的层实现M确实经由模拟关系R实现以上期望的接口L(被称为覆盖接口)。与所公开的实施方式一致,实现M可以是以汇编(或C)编写的程序模块。层接口L可以由一组抽象状态和原语构成。基于L的抽象层机器可以是以L中定义的抽象状态和原语扩展的基本汇编(或C)机器。实现关系表示具有(模拟)关系R的正向模拟认证的层可以实施上下文正确性属性:正确的层可以像“认证的编译器”一样,将在L之上运行的任何安全客户端程序P转换为具有相同行为但在L'之上运行的安全客户端程序(即,通过将L中抽象原语“编译”为其在M中的实现)。基于L的层机器的行为可以被表示为[[·]]L。的正确性属性然后可以被写为其中,表示在程序P和M上的链接运算符。
认证的并发层
与所公开的实施方式一致,每个层接口L可以用“聚焦的”(“focused”)线程集A(其中,并且D是所有线程/CPU ID的域)来参数化。基于并发层接口L[A]的层机器指定A中线程的执行。在一些方面,可以将A外部的线程视为环境。作为非限制性示例,在图3中,域D是{1,2}。当{1}是聚焦的线程集时,环境包含线程2。如在本文中所使用的,为了可读性,可以将L[{i}]简写为L[i],其中,i∈D。并发层接口可以使用一组抽象共享原语和全局日志(global log)l来扩展其顺序对应。与其他线程可能无法观察到的对线程本地原语的调用不同,每个共享原语调用(连同其参数)可以被记录为附加至全局日志末尾的可观察事件。例如,从线程i调用的FAI_t(见图3)将日志“l”带至日志“l·(i.FAI_t)”,其中,符号“·”表示将事件(i.FAI_t)附加至日志。
所公开的实施方式包括基于来自博弈语义的思想的组合(操作)模型,其以一般方式定义了并发程序P的语义。组合模型将程序P在L[D]上的每次运行设计为涉及D的成员(加上调度器)的博弈。根据该框架,每个参与者i∈D通过将事件附加至全局日志l中来贡献其作用。这样的参与者具有策略策略可以是每当l中的最后的事件将控制传送回i时从当前日志l到参与者的下一动作的确定性部分函数。例如,假设线程i仅调用FAI_t,则其策略可以被表示为图13A中描绘的自动机。
在该非限制性描绘中,当控制被传送到i时,全局日志等于l(被表示为“?l”)。线程i首先生成事件i.FAI_t(被表示为“!i.FAI_t”),并且返回票号t(从l起计算)。然后,线程i变得空闲(被表示为用?l',!∈标记的的反射性(reflexive)边缘),并且将不产生任何更多事件。票号t由以下函数计算:该函数对l中的提取并递增事件进行计数。如本文中所使用的,根据日志重建当前共享状态的这样的函数被称为重放函数。调度器(被表示为)用作博弈的评判。在每个回合,调度器使用其策略选择一个线程以进行动作(并且生成事件)。然后,整个层机器的行为(被表示为“[[·]]L[D]”)就是通过在所有可能的调度器下通过进行博弈生成的日志集。当聚焦于线程子集A时,基于接口L[A]的(并发)层机器的语义(或执行)可以在其有效环境上下文的集合上被定义。每个环境上下文(被表示为E)为其“环境”提供策略,即通过调度器加上那些不在A中的参与者进行的策略的并集。
图4示出了具有两个线程(t1和t2)和调度器的示例性系统。方法foo可以在层L[t1]之上运行,该层由L'[t1]在特定环境上下文E'1下实现。这里,E'1是用于调度器的策略和用于线程t2的策略的并集。方法foo也可以在层L[t2]层之上运行,该层由L'[t2]在特定环境上下文E'2下实现。这里,E'2是用于调度器的策略和用于线程t1的策略的并集。图4还描绘了在L'[{t1,t2}]上对foo的两个调用的交织执行,其中环境上下文E'就是调度器策略在该示例中,与所公开的实施方式一致,当给定还包含特定调度器策略的环境上下文E时,P在L[A]上的执行是确定性的。当控制被传送到A的任何成员时,并发机器将运行P,但是当控制被传送到环境时,并发机器将向E询问下一动作。为了加强环境动作的安全性,每个层接口可以指定一组有效环境上下文。与所公开的实施方式一致,这组有效环境上下文对应于基于依赖保证的推理(rely-guarantee-based reasoning)中的“依赖”(或“假定”)条件的广义版本。每个层接口还可以提供可以被表示为全局日志上的不变量的一个或更多个“保证”条件。
本地层接口
作为非限制性示例,聚焦的线程集可以是单例{i}。由于环境执行(包括交织)被全部封装到环境上下文中,因此L[i]实际上是在E上参数化的顺序式的(或本地)接口。在客户端程序P在该本地接口上的每个动作之前,层机器首先重复向E请求环境事件,直到控制被传送到i。然后,层机器基于接收的事件进行动作。因此,可以将在L[i](被表示为(|P|)L[i])上运行P的语义分析为策略。断言在本地层接口之上的并发模块确实满足其规范(即,更抽象的策略)的正确性属性可以由策略模拟经由日志的模拟关系R来定义。
如本文中所使用的,当且仅当对于任何两个相关(通过R)的环境事件序列和任何两个相关的初始日志,对于由产生的任何日志l,必存在可以通过产生的日志l'使得l和l'也满足R,则由另一策略利用模拟关系R(被表示为)来模拟策略考虑在L0[i]上运行的票锁模块M1的acq方法(如图3所示)。其规范可以被表示为图13B中描绘的策略
如图13B所描绘的,可以将对环境上下文E的查询表示为?E。可以证明关系其中,表示在层L0上的运行acq,i作为聚焦线程集。模拟关系id如下:对于任何相等的E和相等的初始状态,如果进行一步,则acq可以进行一步(或更多步)来生成相同事件,并且得到的状态仍然相等。该正确性属性还可以用于定义认证的并发层:
这里,将构建在底层接口L0之上、聚焦于线程集i、实现策略的acq定义为等同于在层L0(i作为聚焦线程集)上的运行acq。令以及通过示出锁释放满足其规范(即,)并且通过应用本文中描述的水平组合规则,得出谓词(1):
这里,将构建在底层接口L0(聚焦于线程集i)之上、实现覆盖接口L'1(聚焦于线程集i)的认证的层实现M1经由模拟关系id被定义为等同于运行接口L'1(i作为聚焦线程集)。该表示法(notation)可以被扩展到一组策略,使得L'1[i]的每个策略可以模拟中的对应的一个。
更高级的策略
在一些实施方式中,尽管以上规范(例如,)是抽象的(即,与语言无关),但是模块内的低级的实现细节和交织仍然可能暴露。例如,如图13B所描绘的,揭示了与环境重复交互以检查送达的票号的循环。与所公开的实施方式一致,L'1[i]的策略可以被细化到原子性的更高级的接口L1[i],如图13C所示。
这里,仅查询E并且产生单个事件i.acq。其然后进入所谓的临界状态(被标记为灰色),以防止在锁被释放之前丢失控制。因此,不需要在临界状态询问E。与所公开的实施方式一致,可以通过在L'1[i]的环境上下文中形成以下“依赖”(即,有效性)条件R来示出L'1[i]与L1[i]之间的策略模拟:
这些条件确保中的循环(等待票被送达)终止。此外,这些条件可以用来证明L′1[i]的每次运行均被L1[i]捕获。作为非限制性示例,如果调度器策略调度为“1、2、2、1、1、2、1、2、1、1、2、2”,则在L′1[D]上运行P(见图3)生成日志:
l′g:=(1.FAI_t)·(2.FAI_t)·(2.get_n)·(1.get_n)·(1.hold)·(2.get_n)·(1.f)·(2.get_n)·(1.g)·(1.inc_n)·(2.get_n)·(2.hold)
lg:=(1.acq)·(1.f)·(1.g)·(1.rel)·(2.acq)
尽管这两个层处的日志(和事件)不同,但是锁获取的顺序和得到的共享状态(由重放函数根据日志计算出)是相同的。通过将日志上的关系R1定义为映射事件i.acq到i.hold、i.rel到i.inc_n以及其他锁相关事件到空事件,可以证明:
L′1[i]≤R1 L1[i]
然后,通过谓词(1)和图9的并行组合规则,可以得出:
并行层组合
与所公开的实施方式一致,如果每个接口的保证暗含另一接口的依赖条件则两个层接口L[t1]和L[t2]是兼容的。通用并行层组合规则由本文中描述的组合模型产生:如果L′[t1]与L′[t2]兼容,L[t1]与L[t2]兼容,并且适用于每个t∈{t1,t2},则得出图4描绘了组合认证的本地层(一个针对t1,另一个针对t2)以为整个机器构建认证的层(其中t1和t2两者均被聚焦)。
线程安全CompCertX和层链接
如上所述,本地层接口是顺序式的,因此可以通过将同一CPU上的线程的堆栈帧合并到单个堆栈将编译器(例如,CompCertX编译器等)修改为线程安全的。在一些实施方式中,这样的线程安全编译器可以被配置成将认证的C层编译为认证的汇编层。
图5描绘了使用所公开的组合规则根据认证的汇编层构造用于整个系统的认证的并发层。组合规则可以包括本文中所讨论的水平、垂直和并行层组合规则。关系暗含以下可靠性定理(soundness theorem),该定理实施上下文细化属性。该定理证明,对于任何客户端程序P,对于行为中的任何日志l,在行为[[P]]L[D]中都必存在日志l′,使得l和l′满足R。
2.并发层接口和演算
以下部分讨论所公开的组合模型向x86多核硬件的应用。
2.1多处理器机器模型
机器模型
图7描绘了并发机器模型和并发层接口的机器状态。在一些实施方式中,的状态可以被表示为元组“s:=(c,fρ,m,a,l)”,其中,部件可以是当前CPU IDC、所有CPU的专用状态fρ(即,从CPU ID到专用状态ρ的部分映射)、共享存储器状态m、抽象状态a和全局事件日志l。专用状态ρ可以包括CPU专用存储器pm(对其他CPU不可见)和寄存器集rs。共享存储器状态m可以在所有CPU之间共享。本地和共享存储器中的每个位置b可以包含存储器值v。抽象状态a通常可以用于分层方法,以汇总来自较低层的存储器中数据结构。这样的抽象状态不是鬼态,因为它们在进行原语调用时影响程序执行。全局日志l可以是可观察事件的列表,记录影响多于一个CPU的所有共享操作。由不同CPU生成的事件按照事件的实际时间顺序在日志中交织,遵循事件的实际时间次序。该特定框架并非旨在进行限制。也可以与该公开内容一致地使用其他框架。
转变关系
在所提供的非限制性示例中,机器具有任意地且不确定地交织的两种类型的转变:程序转变和硬件调度。与所公开的实施方式一致,程序转变可以是三种可能的类型之一:指令执行、专用原语调用和共享原语调用。前两种类型可以是“静默的”,因为它们不生成事件。另一方面,共享原语可以提供访问事件并将事件附加至全局日志的唯一手段。指令的转变仅改变ρ、pm和m,并且根据C或x86汇编的标准操作语义(例如,类似于CompCert中使用的操作语义)被定义。原语调用特定于验证的样式:它们直接从底层将函数f的语义指定为关系σf。该关系可以使用定理证明器(例如,Coq等)来定义。这样的关系可以指定在使用给定参数调用f之后如何更新状态以及f返回何值。
硬件调度
与所公开的实施方式一致,硬件调度转变可以将当前CPU ID c改变为某个ID c'(被记录为调度事件)。这样的转变可以与程序转变任意地交织。在该示例中,在任何步骤处,均可以采取停留在当前CPU上的程序转变,或者到另一CPU的硬件调度。客户端程序P在该多核机器上的行为(被表示为)是通过经由这两种转变执行P而生成的一组全局日志。
存储器模型
在该非限制性示例中,“推/挽”存储器模型可以用于共享存储器m(专用存储器在ρ中被分开处理),该共享存储器将共享存储器操作封装为推/挽事件并且可以检测数据竞争。然而,该特定模型并非旨在进行限制,而是与所公开的实施方式一致,也可以使用其他存储器模型。
在该非限制性示例中,每个共享存储器位置b均可以与抽象状态a下的所有权状态相关联,该所有权状态仅能够由被称为推和挽的两个共享原语来操纵。挽操作可以将所有权从“自由”修改为“由c拥有”,其后,可以由CPU c执行共享存储器访问。推操作可以释放所有权,并且可以将其存储器更新记录在日志中。图6示出了策略σpull′的规范,其中,r{i:v}表示使用值v在字段i处更新记录r。
如果程序试图挽非自由位置,或者试图访问或推到当前CPU不拥有的位置,则可能发生数据竞争,并且机器有被卡住的风险。由所公开的实施方式实现的并发程序验证的一个技术改进是证明程序无数据竞争的能力。在该示例中,通过示出程序不会被卡住来证明程序无数据竞争。
2.2并发层接口
在该非限制性示例中,针对CPU的子集A的并发层接口L[A]可以被定义为被表示为的元组。基于该并发接口的机器可以在其可以捕获CPU的子集并且然后与其余CPU的任何可接受执行组合的意义上是“开放的”。专用状态映射fρ的域也可以是该捕获的(或聚焦的)子集。接口L[A]为该开放机器提供在中被定义并且可以在该级处被调用的原语的集合,指定一组可接受的环境上下文的依赖条件以及日志l应当被保持的保证条件指令转变如前被定义,但是所有硬件调度均由对环境上下文的查询代替。
环境上下文
在一些实施方式中,ε可以是从CPU ID到其策略的部分函数。如本文中所描述的,策略可以是响应于给定日志而生成事件的自动机。当聚焦于CPU集A时,可以将硬件调度的所有可观察到的行为以及其他CPU的程序转变指定为策略的并集(即,ε)。在一些实施方式中,只要存在潜在的交织,机器就可以向ε查询来自其他CPU(和调度器)的事件。
与所公开的实施方式一致,环境事件不能够影响指令和专用原语调用的行为。由于推/挽存储器模型将其他CPU对共享存储器的影响封装到推/挽事件中,因此该影响的缺乏也可以适用于共享存储器读/写。因此,在执行指令和专用原语期间,可能不需要查询ε,并且附加的环境事件将由下一所谓的查询点(即,恰好在执行共享原语之前的点)接收。
为了继续该示例,在每个查询点处,机器可以重复查询ε。每个查询均将当前日志l作为参数,并且从不在A中的CPU c′返回事件(即,ε(c′,l))。该事件然后被附加至l,并且该查询继续进行,直到存在返回A的硬件转变事件(假定硬件调度器是公平的)。使用来自其他CPU的多个事件扩展l的整个处理可以被表示为ε[A,l]。
如本文中所描述的,层接口的和可以指定环境上下文的有效性和日志(包含本地生成的事件)的不变量。在A中线程通过接口L[A]的每一步之后,得到的日志l必须满足保证条件(例如,如果c是由l指示的当前CPU ID,则)。在该示例中,保证条件可以取决于本地生成的事件的有效性以及环境上下文的有效性。依赖条件可以指定取有效的输入日志并且返回事件的有效列表的一组有效环境上下文。
CPU本地层接口
如本文中所使用的,L[c]表示聚焦于单个CPU c的CPU本地层接口。聚焦于CPU c的层L的机器状态可以是(ρ,m,a,l),其中,ρ可以是CPU c的专用状态,以及m可以是共享存储器的本地副本。
图8描绘了传送共享存储器操作的效果的L[c]的推/挽原语的示例性规范。在一些实施方式中,共享存储器m的本地副本仅能够由c本地地访问。L[c]的原语推/挽(push/pull)“传送”共享存储器操作的效果,这取决于重放函数以针对某个位置b重建共享存储器值v并且检查得到的日志的良构性(即,不发生数据竞争)。这些示例性规范并非旨在进行限制。
由于使用ε将σpull参数化,因此也可以将其视为具有图13F中描绘的专用状态更新的策略。如该图所描绘的,层机器可以通过保持共享位置的所有权调用挽之后进入临界状态。层机器可以通过调用推来释放共享位置的所有权,从而退出临界状态。
2.3并发层演算
组合规则
在一些实施方式中,图9中描绘的垂直组合规则(Vcomp)可以使得能够在两个分开的步骤中进行模块M和N(其中,N可以依赖于M)的验证,而图9中描绘的水平组合规则(Hcomp)可以使得能够针对属于同一级的独立的模块M和N进行本地推理。与所公开的实施方式一致,这两个组合规则可以组合同一CPU集上的层。在一些实施方式中,这两个组合规则仅能够在同一CPU集上组合层。
在一些实施方式中,如本文中所描述的,当模拟关系相同时,不同CPU上的层可以由并行组合规则(Pcomp)组合,并且覆盖接口和底层接口两者是兼容的。该兼容性被表示为并且断定L[A]的每个保证条件暗含L[B]的对应的依赖条件,以及反之,L[B]的每个依赖条件暗含L[A]的对应的保证条件。组合的接口L[A∪B]合并了两个层的原语,并且提供有更强的保证和更弱的依赖条件。基于该组合的层接口的机器仅向ε查询不来自A∪B的事件。
多核链接定理
通过组合机器中的所有CPU(被表示为集合D),得到的层接口不依赖于除了来自硬件调度器的环境事件之外的任何环境事件。使用通过硬件提供的原语构造这样的层接口Lx86[D]。然后,可以通过为的每个交织(或日志)选择Lx86[D]的合适的硬件调度器来证明从到Lx86[D]的上下文细化。根据以下多核链接定理,可以将Lx86[D]上的代码验证向下传播到x86多核硬件
该定理表明,对于所有程序P,P上的多核机器的行为通过模拟关系R实现聚焦于CPU的集合D的层接口Lx86上的P的行为。
函数规则
与所公开的实施方式一致,可以通过证明策略之间的模拟使用图9中描绘的函数规则(Fun)关系来构建层。以上相对于图13C至图Xe描述了两个最常见的模式——函数提升(fun-lift)和日志提升(log-lift)。如关于这些附图所讨论的,函数提升模式将具体的实现抽象为低级的策略,而不改变潜在的交织。在该模式中,语言相关的细节(例如,改变时间变量的静默动作)被隐藏,并且数据表示细节(例如,由推事件携载的存储器值)被用抽象状态值代替。日志提升模式始终涉及事件合并和交织混排以形成原子接口。
3.构建认证的多核层
如以下示例所示,所公开的实施方式可以用于验证共享对象。在这些示例中,所有层均基于CPU本地层接口Lx86[c]来构建。
3.1自旋锁
如本领域技术人员将认识到的,自旋锁(例如,上述票锁算法)是用于多核机器的基本同步方法。自旋锁可以用作共享对象和更复杂的同步的构建块。
自旋锁可以通过限制CPU访问存储器位置b来实施互斥。因此,可以将锁操作视为推/挽原语的“安全”版本。例如,当针对b的锁获取成功时,对应的共享存储器被保证为“自由”,这意味着将内容挽到该点处的本地副本是安全的(图10中的行4)。在该非限制性示例中,所公开的实施方式可以用于为图10中的使用票锁算法(在图10中描绘的伪代码中,查询点被表示为)的自旋锁构建层。
底部接口Lx86[c]
在该示例中,可以使用共享原语FAI_t、get_n和inc_n扩展CPU本地接口Lx86[c]。这些原语可以经由x86原子指令直接操纵锁状态t(下一票)和n(送达票)。可以通过对c.FAI_t和c.inc_n事件进行计数的重放函数来计算锁状态。
对Llock low[c]的函数提升
如本文中所讨论的,可以针对该低级接口Llock_low[c](其可以与上述L'1[c]相同)证明策略模拟。注意,与相比,包含额外的静默动作(例如,分配myt,图10中的行2)。在一些实施方式中,模拟关系Rlock不仅表明日志之间的相等性,还将存储器中的锁状态映射到由重放函数计算的状态。模拟关系还必须处理t和n的潜在整数溢出。与所公开的实施方式一致,只要机器中的CPU的总数(即,#CPU)小于2^32(该数字取决于该平台的无符号整数的定义),即使存在溢出,互斥属性也不会被违反。
对Llock[c]的日志提升
如以上所讨论的,可以将acq和rel原语细化为原子接口,使得每个调用在日志中恰好产生一个事件。这些原子锁接口(或策略)可以类似于挽/推规范,除了原子锁接口是安全的(即,不会卡住)。该安全属性可以使用依赖条件来证明,即,对于任何CPUc'≠c,其c'.acq事件必须跟随有以c'.rel结尾的(在临界状态下生成的)其自己的事件的序列。日志中c'.acq与c'.rel之间的距离小于某个数字n。
与所公开的实施方式一致,可以通过将调度器的公平性实施为依赖条件中的任何CPU在m步内被调度的要求来建立活性属性(即,饥饿自由(starvation-freedom))。然后可以示出,acq中的当型循环(while-loop)以“n×m×#CPU”步骤终止。
3.2共享队列对象
如本领域技术人员将认识到的,共享队列在并发程序中被广泛使用(例如,作为调度器中的线程的列表等)。所公开的实施方式在无需直接插入锁实现以及复制锁相关证明的情况下通过准许验证共享队列对象来对现有技术进行改进。以下非限制性示例展示了使用并发抽象层验证使用细粒度锁的共享队列模块。
对Lq[c]的函数提升
在该非限制性示例中,共享队列被实现为双向链表,并且受自旋锁的保护。例如,出队(dequeue,deQ)操作首先获取与队列i相关联的自旋锁,然后在临界状态下执行实际的出队操作,并且最后释放锁。与所公开的实施方式一致,在保持对应的锁的假设下,可以通过验证包含对本地副本执行出队操作的代码的中间函数deQ_t来进行验证deQ。由于在临界状态下不需要环境查询,因此为deQ_t构建并发层类似于构建顺序层。抽象状态a.tcbp和a.tdqp可以表示线程控制块(即,tcb)数组和线程队列数组。抽象tdqp可以是从队列索引到抽象队列的部分映射,其可以被表示为tcb索引的列表。与所公开的实施方式一致,deQ_t可以被示出为满足其规范σdeQ_t,如图11所示。
对Lq_high[c]的函数提升和日志提升
与所公开的实施方式一致,用锁原语包装deQ_t的deQ函数可以被示出为满足原子接口。利用将两个队列相关锁事件(即,c.acq和c.rel)合并到较高层处的单个事件c.deQ中的模拟关系Rlock,可以示出图13G中描绘的策略模拟。
构建认证的多线程层
多线程程序必须处理不仅由硬件调度器还由线程调度原语的显式调用触发的交织。所公开的实施方式包括处理调度原语的认证的层,用组合规则配备线程本地层接口的改进的方法,以及线程安全编译器。
4.1用于调度原语的认证的层
与所公开的实施方式一致,上述共享线程队列可以支持支持多线程的层接口Lbtd[c]。在该层接口处,线程之间的转变可以使用以C和汇编的混合实现的调度原语来进行。
在多线程设置中,每个CPU c具有专用就绪队列rdq和共享未决队列pendq(包含由其他CPU唤醒的线程)。线程让步(yield)将第一未决线程从pendq发送到rdq,并且然后切换到下一就绪线程。设置还可以包括一个或更多个共享休眠队列slpq。当休眠线程被唤醒时,如果线程属于当前运行的CPU,则休眠线程将被直接附加至就绪队列。否则,休眠线程将被附加至其所属的CPU的未决队列。
线程切换可以通过上下文切换函数cswitch来实现,上下文切换函数cswitch保存当前线程的内核上下文(例如,以上所讨论的ra、ebp、ebx、esi、edi、esp),并且加载目标线程的上下文。由于该cswitch(由让步和休眠调用)不满足C调用约定,因此其仅能够在汇编级处被实现。调度原语例如让步可以首先查询E以更新日志,附加其自己的事件,并且然后调用cswitch来传送控制,如图14A所示。
在一些实施方式中,该层接口可以引入三个新事件c.yield、c.sleep(i,lk)(在保持锁lk的同时在队列i上休眠)和c.wakeup(i)(唤醒队列i)。这些事件记录线程切换,线程切换可以用于通过重放函数来跟踪当前运行的线程。
4.2多线程层接口
CPU本地接口Lbtd[c]可以被配置成捕获CPU c的整个线程集的执行,并且不支持线程本地验证。所公开的实施方式可以通过准许分别关于每个线程的形式化推理以及证明的随后组合以获得全局属性来对现有方法进行改进。可以通过引入新的层接口来实现这样的改进,该新的层接口是组合的并且仅聚焦于CPU c上运行的线程的子集。
令Tc表示在CPU c上运行的整个线程集。基于L[c],可以构造多线程层接口该多线程层接口可以在聚焦的线程集上被参数化。除了TA之外,在c上运行的其他线程的策略形成线程上下文εt。该多线程层接口的依赖条件用εt的有效集扩展并且保证条件用TA中线程所保持的不变量代替由于机器模型不允许抢占,因此仅在执行调度原语期间才查询εt,该调度原语取决于目标线程是否被聚焦而具有两种行为。
在非限制性示例中,考虑图14B中所示的在TA={0,1}的情况下的执行。每当执行切换(通过让步或休眠)到TA外部的线程(即,图14B中的黄色让步)时,执行就采取环境步骤(即,红色框内部),重复地将由环境上下文ε和线程上下文εt返回的事件附加到日志,直到指示控制已被切换回到聚焦线程的c.yield事件。每当执行切换到聚焦线程时(即,上面蓝色让步),其将在不询问ε/εt的情况下执行上下文切换,并且其行为与Lbtd[c]的行为相同。
组合多线程层
与所公开的实施方式一致,如果保证条件暗含针对每个线程的依赖条件,则具有不相交的聚焦线程集的多线程层接口可以被并行地组合(使用扩展的Pcomp规则)。得到的聚焦线程集是组合的线程集的并集,并且一些环境步骤被另一线程集的本地步骤“代替”。例如,如果在图14C中用线程2与TA组合,则线程0的让步然后将引起向聚焦线程的切换。在该示例中,由ε和εt生成的事件列表l1可以被划分为两部分:l1a·c.yield(由线程2生成)和l1b(由来自{0,1,2}之外的线程的事件构成)。
多线程链接
当整个Tc被聚焦时,所有调度原语落入第二情况,并且从不切换到未被聚焦的那些。与所公开的实施方式一致,调度行为等于Lbtd[c]的调度行为。通过引入包含Lbtd[c]的所有原语的多线程层接口Lhtd[c][Tc],可以证明以下多线程链接定理:
Lbtd[c]≤id Lhtd[c][Tc]
该定理保证,一旦基于Lhtd[c][Tc]的多线程机器捕获了整个线程集,在顶部运行的线程的属性就可以向下传播到具有具体的调度实现的层。
4.3线程本地层接口
如果多线程接口L[c][t]仅聚焦于单个线程t∈Tc,则让步原语和休眠原语始终切换到未聚焦的线程,并且然后重复查询ε和εt,直到退回到t,如图14D所示。
与所公开的实施方式一致的程序规范是终止敏感的。因此,所公开的实施方式使得能够实现控制返回到聚焦线程集的证明,从而改进了现有分析技术。在一些方面,该证明可以依赖于软件调度器r的假定公平性以及每个运行线程在有限步数内放弃CPU的要求。由于调度原语总是以切换回到同一线程而结束,因此可以将L[c][t]描述为“线程本地”层接口。以该方式,调度原语不修改内核上下文(即,ra、ebp、ebx、esi、edi、esp),并且相对于线程实际上用作“无操作”,除非共享日志得到更新。以此方式,调度原语可以满足C调用约定。
4.4排队锁
与所公开的实施方式一致,可以在线程本地层接口上构建诸如排队锁(以上对于图12所讨论的)的附加同步工具包。在一些实施方式中,排队锁可以被配置成使等待线程进入休眠以避免忙于旋转。在一些实施方式中,排队锁的C实现可以使用自旋锁和低级调度器原语(即,休眠和唤醒)。可以通过将验证任务分解为Lhtd[c][t]以上的多层来完成对排队锁的形式化验证。
与所公开的实施方式一致,排队锁的正确性属性可以由两部分构成:互斥和饥饿自由。锁实现(如图12所示)可以互斥,因为锁定的忙值(ql_busy)始终等于锁保持者的线程ID。在该非限制性示例中,忙值可以在无锁时由锁请求者设置(图12的行6),或者在释放锁时由先前锁保持者设置(行12)。通过自旋锁的原子接口,可以通过证明休眠原语调用的终止来部分地建立排队锁的饥饿自由证明(行4)。由于所有锁保持者最终将把锁释放,因此所有休眠线程将在有限的步数内被添加到未决队列或就绪队列。因此,由于公平的软件调度器,休眠将终止。注意,可以使用线程安全编译器(例如,CompCertX等)将在C级处证明的所有这些属性向下传播到汇编级。
4.5线程安全编译和链接
所公开的实施方式包括适于处理调用调度原语的程序的编译器(例如,CompCertX验证的分开的编译器)。如上所述,所公开的实施方式使用线程本地层接口来分配C样式规范至部分地以汇编实现的调度原语(让步和休眠)。这使得能够进行Lhtd[c][t]上处于C样式规范级的每个线程的代码的形式化验证。然后,可以根据以上所公开的多线程链接定理将单独的线程组合成Lbtd[c]上的程序。
所公开的实施方式还包括存储器模型,该存储器模型可以确保处于汇编级的编译程序满足本文中所讨论的并行组合规则的假设。每当调用函数时,现有编译器(例如,CompCert等)可以为其堆栈帧分配存储器中的新的存储器块。因此,在线程本地层Lhtd[c][t]之上,在线程内调用的函数可能将其堆栈帧分配为线程专用存储器状态,并且相反地,线程从不意识到由其他线程分配的任何较新的存储器块。然而,在Lbtd[c]上,所有堆栈帧必须在CPU本地存储器(即,线程共享存储器)中被分配,而不管其属于哪个线程。因此,所有这样的堆栈帧都必须在线程组合证明中被说明。
所公开的实施方式通过移除一些存储器块的访问许可的存储器扩展来解决该问题。与所公开的实施方式一致,修改了线程本地让步原语的语义,使得其为其他线程的堆栈帧分配足够的空存储器块作为占位符。这些空块缺少访问许可。将通过分配n个新的空块而存储器从m扩展时的m中的块的总数表示为nb(m)和liftnb(m,n),对于每个线程i及其线程本地存储器mi,维护liftnb(mi,nb(m)-nb(mi))与线程共享存储器状态m之间的存储器扩展。
所公开的实施方式包括两个不相交线程集的专用存储器状态m1、m2与并行组合之后的线程共享存储器状态m之间的三元关系该关系满足图12中的属性,确保让步原语表现良好。特别地,条件nb(m1)≤nb(m2)确保仅在受聚焦线程的存储器状态下分配非空存储器块,从而保证当线程调用让步时与当线程重新获得控制时之间创建的所有新的存储器块由其他线程分配。Lift-L使得能够当线程让步和取回控制时保持不相交并集不变(即,不同线程的专用存储器状态不交叠),从而在其专用存储器状态m1下分配空存储器块以说明由其他线程在m中分配的块。
基于两个存储器状态的不相交并集,然后当且仅当存在存储器状态m'使得m'是m1、…、mN-1和保持的不相交并集时,使用规则Lift-R和Lift-L来通过称m是N个线程(在单个处理器上)的专用存储器状态m1、…、mN的不相交并集以推广到N个线程。
5.示例性实现
所公开的实施方式已经在Coq证明助理中实现了CCAL工具包。图14E呈现了图2中的每个部件的行数(在Coq中)。辅助库包含64位整数、列表、映射、整数运算等的常见的策略和引理。
所公开的实施方式已经被用于实现、指定和验证各种并发程序。图14F呈现了相对于实现的部件的统计中的一些。对于锁实现,它们的源代码不仅包含相关联的函数的代码,还包含数据结构及其初始化。除了顶层接口之外,规范还包含中间层中使用的所有规范。对于票和MCS锁,模拟证明列除了正确性证明之外还包括饥饿自由的证明(约1500行)。底层C实现与锁的高级规范之间的差距也促成这些部件的大的证明大小。例如,票锁的中间规范对票字段使用无界整数,而实现使用绕回零的二进制整数。类似地,队列在规范中被表示为逻辑列表,而队列被实现为双向链表。
用于并发程序的证明策略是组合式的。票锁和MCS锁两者均共享上述相同的高级原子规范(或策略)。因此,锁实现可以在不影响使用锁的更高级模块中的任何证明的情况下自由互换。在实现共享队列库时,还重用本地(或顺序)队列库的证明和实现。为了实现原子队列对象,仅用锁获取和释放语句包装本地队列操作。如图14F所示,使用验证的锁模块来构建原子对象例如共享队列相对简单,并且不需要很多代码行。票锁的性能已经在英特尔4核i7-2600S(2.8GHz)上进行了测量。实现票锁导致35个CPU周期的延迟。
与所公开的实施方式一致,每当引入新的具体并发对象实现时,可以在其覆盖接口中用抽象原子对象代替具体并发对象实现。所有共享抽象状态均可以使用单个全局日志表示,因此每个原子方法调用的语义可能需要重放整个全局日志以找出返回值。尽管用于处理共享原子对象的该框架可能显得效率低下,但该框架使得能够应用博弈语义思想并且定义支持并行层组合的通用语义。
所公开的实施方式通过提供线程生成和连接原语并且为每个新线程分配唯一的ID(例如,t,其必须是完整的线程ID域集D的成员)来改进使用并行组合命令来创建和终止新线程的并发语言。可以在整个程序P和D的所有成员上进行与所公开的实施方式一致的并行层组合。这使得能够进行关于环境的全部策略(即,过去事件和将来事件两者)上的当前线程的行为的推理。即使从未创建线程t,用于在L[t]上运行P的语义也仍然可以被很好地定义,原始是其将仅仅总是查询其环境上下文以构造全局日志。
智能合约应用
图15示出了根据一些实施方式的说明性区块链1500。在该示例中,区块链1500包括多个块1500-0、1500-1、1500-2等,其中,每个块可以包括散列、时间戳和交易数据。时间戳可以指示创建对应的块的时间,并且交易数据可以表示要记录在区块链1500上的一个或更多个交易。除了块1500-0(其有时被称为创世块)之外,每个块中的散列可以是区块链1500中的先前块的加密散列。在一些实施方式中,用于对块进行散列处理的加密散列函数可以是确定性的(即,给定相同输入,则加密散列函数返回相同输出),并且可以被选择,使得:在给定特定输出的情况下,恢复用于生成输出的输入或将散列到相同输出的另一输入是计算上密集的(例如,恢复输入所需的计算量在输出的大小上增长快于任何多项式函数);找到导致相同输出的两个不同输入是计算上密集的(例如,找到这样的冲突所需的计算量在输出的大小上增长快于任何多项式函数);以及/或者对输入的小的改变(例如,改变一位)导致对应的输出的显著的改变(例如,超过一半的输出位改变)。以此方式,可以通过将对块进行散列处理的结果与存储在后续块中的散列进行比较来检测修改块的尝试。例如,为了在不被检测到的情况下修改块1500-0,攻击者可能还必须修改存储在块1500-1中的散列,这又需要修改存储在块1500-2中的散列等。因此,随着更多的块被添加到区块链1500,攻击者修改较早的块可能变得越来越困难。在一些实施方式中,分布式计算平台可以由一个或更多个节点的网络提供,这些节点共同维护区块链和/或执行存储在区块链上的一个或更多个智能合约。例如,与智能合约相关联的软件代码和/或状态信息可以被存储在区块链上,并且可以被使用特定地址从区块链进行访问。软件代码的执行可以由事件触发,并且可以导致智能合约的状态的改变。这可以作为交易被记录在区块链上。以此方式,智能合约和/或其执行历史可以防篡改。
图16示出了根据一些实施方式的参与用于执行智能合约的分布式计算平台的说明性节点1600。在该示例中,节点1600包括虚拟机1620、操作系统1625和硬件1630。虚拟机1620可以为智能合约提供运行环境,并且可以将智能合约与在节点1600上执行的其他进程隔离。操作系统1625可以向虚拟机1620提供各种服务,包括但不限于调度对硬件1630的访问。硬件1630可以包括一个或更多个处理器、存储器、输入装置、输出装置、网络接口等。例如,节点1600可以使用网络接口与也参与分布式计算平台的一个或更多个其他节点进行通信。在一些实施方式中,编译器1610可以被设置成将智能合约的源代码1605编译为字节代码1615,该字节代码可以被加载到虚拟机1620中以用于执行。例如,虚拟机1620可以包括被编程成解释字节代码1615的解释器。发明人已经认识并意识到,可以使用以上详细描述的一种或更多种技术对智能合约的正确性进行形式化验证。例如,一组一个或更多个智能合约可以被验证为并发抽象层,其中,用于记录交易的区块链可以被建模为全局日志。
图17示出了根据一些实施方式的说明性并发抽象层1700。在该示例中,并发抽象层1700包括层实现M、覆盖接口L和底层接口L'。层实现可以包括多个智能合约1705A、1705B、1705C等。这些智能合约可以彼此交互和/或与一个或更多个其他智能合约交互。例如,一个或更多个较低级的智能合约1710可以提供智能合约1705A、1705B、1705C等可以经由底层接口L'访问的一个或更多个较低级的功能。利用由一个或更多个较低级的智能合约1710提供的一个或更多个较低级的功能,智能合约1705A、1705B、1705C等可以经由覆盖接口L向一个或更多个较高级的智能合约1715提供一个或更多个较高级的功能。发明人已经认识并意识到,可以使用以上详细描述的一种或更多种技术来验证在底层接口L'之上运行的智能合约1705A、1705B、1705C等模拟覆盖接口L。例如,在一些实施方式中,可以使用第一逻辑全局日志对用于记录智能合约(例如,智能合约1705A、1705B、1705C等)所执行的交易的底层区块链进行建模,并且可以使用所附的稿件中详细描述的一种或更多种技术来验证第一逻辑全局日志与表示可接受行为的第二逻辑全局日志一致。
图18示出了根据一些实施方式的说明性物理区块链1800和说明性逻辑区块链1805。物理区块链1800可以是表示用于记录由智能合约(例如,说明性智能合约1705A、1705B、1705C等)执行的交易的底层区块链的逻辑全局日志,并且可以包括一系列较低级的交易LT0、LT1、LT2等。逻辑区块链1800可以是另一逻辑全局日志,其包括一系列较高级的交易HT0、HT1、HT2等。在一些实施方式中,对在底层接口L'之上运行的智能合约1705A、1705B、1705C等模拟覆盖接口L的验证可以包括验证物理区块链1800与逻辑区块链1805一致。作为一个示例,较低级的交易LT0和LT1可以共同对应于较高级的交易HT0。例如,较高级的交易HT0可以是从第一方到第二方的转移,并且可以通过第一方发起转移(较低级的交易LT0)并且第二方确认转移(较低级的交易LT1)来实现。作为另一示例,较低级的交易LT2可以是环境转变,其可以表示由作为较低级的环境中的智能合约1705A、1705B、1705C等同时执行的智能合约所采取的动作。较低级的交易LT2可以对应于较高级的交易HT2,其可以表示在对应的较高级的环境中的智能合约所采取的动作。作为另一示例,较低级的交易LT3可以表示由一个或更多个较低级的智能合约1710采取而与被提供给智能合约1705A、1705B、1705C等的任何较低级的功能无关的动作。因此,在逻辑区块链1800中没有对应的较高级的交易。作为另一示例,较高级的交易HT2可以表示由智能合约1705A、1705B、1705C等中之一通过调用由一个或更多个较低级的智能合约1710提供的较低级的功能提供给一个或更多个较高级的智能合约1715的较高级的功能。该较低级的功能可以由较低级的交易LT4表示。在一些实施方式中,对在底层接口L'之上运行的智能合约1705A、1705B、1705C等模拟覆盖接口L的验证可以包括验证以下内容:在给定执行智能合约1705A、1705B、1705C等的环境的情况下,并且在给定物理区块链和对应的逻辑区块链的情况下,可以将要附加至物理区块链的一个或更多个较低级的交易与要附加至逻辑区块链的一个或更多个较高级的交易相匹配。这样的环境可以捕获关于作为智能合约1705A、1705B、1705C等同时执行的一个或更多个智能合约的一个或更多个假设。发明人已经认识并意识到将一个或更多个智能合约作为并发抽象层进行验证的各种益处。例如,使用以上详细描述的一种或更多种技术,可以将同时执行智能合约的复杂系统分解为多个层部件。这些部件可以被分别进行形式化指定和验证,并且然后链接在一起以形成端到端的完全验证系统。由于可能没有漏洞,因此这样的验证的系统可以防攻击。例如,不论在何种情况下,在执行期间的任一点处,软件实现可以与形式化规范一致。在一些实施方式中,可以使用逻辑全局日志对记录由多个智能合约中的任何一个执行的每个交易的区块链进行建模。可以基于来自逻辑全局日志的功能将智能合约的形式化语义提供给由智能合约执行的一个或更多个交易的序列(在切换到另一智能合约之前)。在一些实施方式中,可以使用水平组合和/或并行组合将多个智能合约组合到系统中。例如,可以基于关于作为要验证的智能合约同时执行的一个或更多个其他智能合约的行为的一个或更多个假设来验证智能合约的行为,并且可以使用环境对一个或更多个假设进行建模。在一些实施方式中,可以使用垂直组合将多个智能合约组合到系统中。例如,可以在现有智能合约上构建新的抽象层(例如,通过隐藏一个或更多个较低级的交易和/或引入一个或更多个较高级的交易)。因此,可以为每个新的抽象层提供新类型的逻辑全局日志。在一些实施方式中,可以通过建立不同抽象层处的逻辑全局日志与对应的环境之间的模拟关系来验证这些全局日志之间的一致性。例如,可以连接不同抽象层处的环境,并且可以基于对应的环境来组合不同抽象层处的智能合约。以此方式,除了水平组合和/或并行组合之外,或者代替水平组合和/或并行组合,还可以支持智能合约的垂直组合。在一些实施方式中,环境可以指示作为要验证的智能合约同时执行的一个或更多个智能合约的过去行为和/或将来行为。以此方式,可以对环境中的一个或更多个智能合约的未来行为施加一个或更多个公平性约束,并且除了功能正确性属性之外或代替功能正确性属性,可以验证一个或更多个进程属性。在一些实施方式中,每个层模块可以被形式化验证为基于底层接口正确地实现覆盖接口。覆盖接口的规范可以指示对于覆盖接口要如何构造逻辑全局日志和/或要考虑何环境。同样,底层接口的规范可以指示对于底层接口要如何构造逻辑全局日志和/或要考虑何环境。然后可以建立形式化模拟关系,以将覆盖接口的环境、一个或更多个抽象状态和/或逻辑全局日志与在底层接口之上运行的层模块的环境、一个或更多个抽象状态和/或逻辑全局日志连接。在一些实施方式中,可以构造形式化证明以示出模拟关系在对要验证的层模块中的方法的每个方法调用的开始处有效,并且在层模块中的每个语句的执行期间被保留。在一些实施方式中,在验证每个层模块之后,可以将层模块编译到汇编层中(例如,使用验证的编译器)。然后可以使用水平、并行和/或垂直组合规则来组合汇编层以形成系统。在一些实施方式中,一个或更多个形式化规范和/或证明包括存储在硬盘或存储器中的一个或更多个显式伪迹(artifact),这些显式伪迹可以由第三方独立地检查。
图19示意性地示出了可以在其上实现本公开内容的任何方面的说明性计算机1900。在图19中示出的实施方式中,计算机1900包括具有一个或更多个处理器的处理单元1901以及可以包括例如易失性和/或非易失性存储器的非暂态计算机可读存储介质1902。存储器1902可以存储对处理单元1901进行编程以执行本文中描述的任何功能的一个或更多个指令。计算机1900还可以包括除了系统存储器1902之外的其他类型的非暂态计算机可读介质例如存储装置1905(例如,一个或更多个磁盘驱动器)。存储装置1905还可以存储一个或更多个应用程序和/或由应用程序使用的外部部件(例如,软件库),其可以被加载到存储器1902中。计算机1900可以具有一个或更多个输入装置和/或输出装置,例如图19中所示的装置1906和1907。这些装置除了别的之外可以用于呈现用户接口。可以用于提供用户接口的输出装置的示例包括用于输出的视觉呈现的打印机或显示屏幕以及用于输出的可听呈现的扬声器或其他声音生成装置。可以用于用户接口的输入装置的示例包括键盘和定点装置,例如鼠标、触摸板和数字面板。作为另一示例,输入装置1907可以包括用于捕获音频信号的麦克风,并且输出装置1906可以包括用于视觉呈现识别的文本的显示屏幕和/或用于可听地呈现识别的文本的扬声器。如图19所示,计算机1900还可以包括一个或更多个网络接口(例如,网络接口1910),以使得能够经由各种网络(例如,网络1920)进行通信。网络的示例包括局域网或广域网,例如企业网络或因特网。这样的网络可以基于任何合适的技术并且可以根据任何合适的协议来操作,并且可以包括无线网络、有线网络或光纤网络。虽然已经如此描述了至少一个实施方式的若干方面,但是应当认识到,本领域技术人员将容易想到各种改变、修改和改进。这样的改变、修改和改进旨在落入本公开内容的精神和范围内。因此,上述描述和附图仅作为示例。可以以多种方式中的任何方式来实现本公开内容的上述实施方式。例如,可以使用硬件、软件或其组合来实现实施方式。当以软件实现时,软件代码可以在任何合适的处理器或处理器集合上执行,而不管是设置在单个计算机中还是分布在多个计算机中。此外,本文中概述的各种方法或处理可以被编码为软件,该软件可以在采用各种操作系统或平台中的任何操作系统或平台的一个或更多个处理器上执行。此外,这样的软件可以使用许多合适的编程语言和/或编程工具或脚本工具中的任何编程语言和/或编程工具或脚本工具来编写,并且还可以被编译为在框架或虚拟机上执行的可执行机器语言代码或中间代码。在该方面,本文中所公开的构思可以被实施为编码有一个或更多个程序的非暂态计算机可读介质(或多个计算机可读介质)(例如,计算机存储器、一个或更多个软盘、致密盘、光盘、磁带、闪速存储器、现场可编程门阵列或其他半导体装置中的电路配置或其他非暂态有形计算机存储介质),一个或更多个程序当在一个或更多个计算机或其他处理器上被执行时执行实现上述本公开内容的各种实施方式的方法。一个或更多个计算机可读介质可以是可传输的,使得存储在其上的一个或更多个程序可以被加载到一个或更多个不同的计算机或其他处理器上以实现如以上所讨论的本公开内容的各个方面。在本文中使用术语“程序”或“软件”以指代任何类型的计算机代码或一组计算机可执行指令,其可以用于对计算机或其他处理器进行编程以实现如以上所讨论的本公开内容的各个方面。另外,应当认识到,根据本实施方式的一个方面,当被执行时执行本公开内容的方法的一个或更多个计算机程序不需要驻留在单个计算机或处理器上,而是可以以模块化方式分布在许多不同的计算机或处理器中以实现本公开内容的各个方面。计算机可执行指令可以呈许多形式,例如由一个或更多个计算机或者其他装置执行的程序模块。通常,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、部件、数据结构等。通常,程序模块的功能可以根据需要在各种实施方式中进行组合或分散。此外,数据结构可以以任何合适的形式存储在计算机可读介质中。为了简化说明,数据结构可以被示出为具有通过数据结构中的位置来相关的字段。这样的关系同样可以通过为字段分配存储来实现,该存储具有计算机可读介质中的传达字段之间的关系的位置。然而,可以使用任何合适的机制(包括通过使用指针、标签或在数据元素之间建立关系的其他机制)来建立数据结构的字段中的信息之间的关系。本公开内容的各个特征和方面可以单独使用,以两个或更多个的任意组合使用,或者以前面所述的实施方式中没有具体讨论的多种布置使用,并且因此其应用不限于前面的描述中阐述的或附图中示出的部件的细节和布置。例如,一个实施方式中描述的方面可以与其他实施方式中描述的方面以任何方式组合。此外,本文中所公开的构思可以被实施为提供了其示例的方法。作为方法的一部分执行的动作可以以任何合适的方式排序。因此,可以构造以与所示顺序不同的顺序来执行动作的实施方式,其可以包括同时执行尽管在说明性实施方式中被示为顺序动作的一些动作。权利要求中用于修饰权利要求要素的诸如“第一”、“第二”、“第三”等的序数术语的使用本身并不意味着一个权利要求要素相对于另一权利要求要素的任何优先、居先或顺序或者执行方法的动作的时间顺序,而仅用作用于将具有某个名称的一个权利要求要素与具有相同名称(如果没有使用序数术语的话)的另一要素相区分的标记以区分权利要求要素。此外,本文中使用的措辞和术语是出于描述的目的,而不应当被视为进行限制。在本文中使用“包括”、“包含”、“具有”、“含有”、“涉及”及其变型意指包含之后列出的项目及其等同物,以及另外的项目。
Claims (13)
1.一种用于覆盖接口的形式化验证的方法,包括:
将所述覆盖接口建模为在底层接口上构建的多个层实现,所述底层接口由多个线程集参数化;
通过执行以下中的至少之一来验证所述覆盖接口:
验证到在所述底层接口上构建的程序的映射实现到策略的映射,其中:
在所述底层接口上运行共享原语的语义由所述策略来模拟;
验证第一程序模块根据第一模拟关系实现所述覆盖接口,其中:
在所述底层接口上构建的第二程序模块根据第二模拟关系实现第一中间接口;
在所述第一中间接口上构建的第三程序模块根据第三模拟关系实现所述覆盖接口;并且
所述第一程序模块是所述第二程序模块和所述第三程序模块的组合,并且所述第一模拟关系是所述第二模拟关系和所述第三模拟关系的组合;
验证第四程序模块根据第四模拟关系实现所述覆盖接口,其中:
在所述底层接口上构建的第五程序模块根据所述第四模拟关系实现第二中间接口;
在所述底层接口上构建的第六程序模块根据所述第四模拟关系实现第三中间接口;并且
所述第四程序模块是所述第五程序模块和所述第六程序模块的组合,并且所述覆盖接口是所述第二中间接口和所述第三中间接口的组合;
验证在第四中间接口上构建的第七程序模块根据第五模拟关系实现第五中间接口,其中:
所述第四中间接口由所述底层接口根据第六模拟关系来模拟;
所述第七程序模块根据第七模拟关系实现所述覆盖接口;
所述覆盖接口由所述第五中间接口根据第八模拟关系来模拟;并且
所述第五模拟关系是所述第六模拟关系、所述第七模拟关系和所述第八模拟关系的组合;
验证在所述底层接口上构建的第八程序模块实现所述覆盖接口,其中:
所述底层接口由第一线程集和第二线程集的并集参数化;
所述覆盖接口由第一线程集和第二线程集的所述并集参数化;
第一底层接口由所述第一线程集参数化,并且第二底层接口由所述第二线程集参数化;
第一覆盖接口由所述第一线程集参数化,并且第二覆盖接口由所述第二线程集参数化;
在所述第一底层接口上构建的所述第八程序模块实现所述第一覆盖接口;
在所述第二底层接口上构建的所述第八程序模块实现所述第二覆盖接口;
所述第一底层接口与所述第二底层接口兼容;并且
所述第一覆盖接口与所述第二覆盖接口兼容;以及
验证由第三线程集参数化的接口与由第四线程集参数化的接口兼容,其中:
对于第三线程集中的所有线程,由所述第四线程集参数化的接口的依赖条件意味着由所述第三线程集参数化的接口的保证条件;
对于第四线程集中的所有线程,由所述第三线程集参数化的接口的依赖条件意味着由所述第四线程集参数化的接口的保证条件;
由所述第三线程集和所述第四线程集的交集参数化的接口的依赖条件等于由所述第三线程集参数化的接口的依赖条件和由所述第四线程集参数化的接口的依赖条件的并集;
由所述第三线程集和所述第四线程集的交集参数化的接口的保证条件等于由所述第三线程集参数化的接口的保证条件和由所述第四线程集参数化的接口的保证条件的交集;并且
由所述第三线程集和所述第四线程集的交集参数化的接口的原语的集合等于由所述第三线程集参数化的接口的原语的集合和由所述第四线程集参数化的接口的原语的集合的组合。
2.根据权利要求1所述的方法,其中,验证所述覆盖接口包括执行以下中的至少两个:
验证到在所述底层接口上构建的所述程序的映射实现到所述策略的映射;
验证所述第一程序模块根据所述第一模拟关系实现所述覆盖接口;
验证所述第四程序模块根据第四模拟关系实现所述覆盖接口;
验证在所述第四中间接口上构建的所述第七程序模块根据第五模拟关系实现所述第五中间接口;
验证在所述底层接口上构建的所述第八程序模块实现所述覆盖接口;以及
验证由所述第三线程集参数化的接口与由所述第四线程集参数化的接口兼容。
3.根据权利要求1所述的方法,其中,验证所述覆盖接口包括执行以下中的至少三个:
验证到在所述底层接口上构建的所述程序的映射实现到所述策略的映射;
验证所述第一程序模块根据所述第一模拟关系实现所述覆盖接口;
验证所述第四程序模块根据第四模拟关系实现所述覆盖接口;
验证在所述第四中间接口上构建的所述第七程序模块根据第五模拟关系实现所述第五中间接口;
验证在所述底层接口上构建的所述第八程序模块实现所述覆盖接口;以及
验证由所述第三线程集参数化的接口与由所述第四线程集参数化的接口兼容。
4.根据权利要求1所述的方法,其中,验证所述覆盖接口包括执行以下全部:
验证到在所述底层接口上构建的所述程序的映射实现到所述策略的映射;
验证所述第一程序模块根据所述第一模拟关系实现所述覆盖接口;
验证所述第四程序模块根据第四模拟关系实现所述覆盖接口;
验证在所述第四中间接口上构建的所述第七程序模块根据第五模拟关系实现所述第五中间接口;
验证在所述底层接口上构建的所述第八程序模块实现所述覆盖接口;以及
验证由所述第三线程集参数化的接口与由所述第四线程集参数化的接口兼容。
5.根据前述权利要求中任一项,其中,验证所述覆盖接口包括:在验证所述第一程序模块根据所述第一模拟关系实现所述覆盖接口之后,执行线程安全编译。
6.根据前述权利要求中任一项,其中,对所述覆盖接口进行建模包括利用公平调度器策略对调度器进行建模。
7.根据前述权利要求中任一项,其中,对所述覆盖接口进行建模包括要求确切动作。
8.根据前述权利要求中任一项,其中,对所述覆盖接口进行建模包括对指定过去事件和未来事件的环境上下文进行建模。
9.一种用于覆盖接口的形式化验证的方法,包括:
确定在底层接口上运行第一共享原语的语义由第一策略来模拟,所述第一策略将所述第一原语的动作描述为第一日志的第一函数,其中,所述确定包括构造模拟关系的证明;
通过将所述第一策略与第二策略组合来生成中间并发层,所述第二策略将所述底层接口上的第二共享原语的动作描述为所述第一日志的第二函数;以及
确定所述中间并发层由第一覆盖层来模拟。
10.根据权利要求9所述的方法,其中,所述第一覆盖层将所述第一共享原语表示为原子操作。
11.根据权利要求9所述的方法,其中,确定所述中间并发层由所述第一覆盖层模拟包括:构造所述中间并发层的日志与所述第一覆盖层的日志之间的模拟关系的证明。
12.根据权利要求9所述的方法,其中,根据水平组合规则,将所述第一策略与所述第二策略组合。
13.一种用于验证智能合约的方法,包括:
将一个或更多个智能合约建模为并发抽象层,其中:
所述并发抽象层包括层实现、底层接口和覆盖接口;并且所述层实现包括所述一个或更多个智能合约;并且
至少部分地通过构造与在所述底层接口之上运行的所述层实现模拟所述覆盖接口有关的形式化证明来验证所述一个或更多个智能合约的正确性。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
FR1761318 | 2017-11-28 | ||
FR1761318 | 2017-11-28 | ||
PCT/US2018/062883 WO2019108676A1 (en) | 2017-11-28 | 2018-11-28 | Systems and methods of formal verification |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112119423A true CN112119423A (zh) | 2020-12-22 |
Family
ID=66665814
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880087842.1A Pending CN112119423A (zh) | 2017-11-28 | 2018-11-28 | 形式化验证的系统和方法 |
Country Status (3)
Country | Link |
---|---|
US (2) | US11409630B2 (zh) |
CN (1) | CN112119423A (zh) |
WO (1) | WO2019108676A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112817599A (zh) * | 2021-01-27 | 2021-05-18 | 南京大学 | 软件函数形式语义及形式化证明脚本自动生成方法 |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112119423A (zh) | 2017-11-28 | 2020-12-22 | 耶鲁大学 | 形式化验证的系统和方法 |
US11502822B2 (en) * | 2019-03-04 | 2022-11-15 | International Business Machines Corporation | Static analysis of smart contract determinism |
CN110532176A (zh) * | 2019-07-31 | 2019-12-03 | 平安科技(深圳)有限公司 | 一种智能合约的形式化验证方法、电子装置及存储介质 |
CN110555320B (zh) * | 2019-08-21 | 2021-03-23 | 杭州趣链科技有限公司 | 一种基于区块链存证智能合约的形式验证方法 |
CN110519277B (zh) * | 2019-08-29 | 2020-08-21 | 上海威尔立杰网络科技发展有限公司 | 一种基于单点执行合约实现控制其它系统的方法 |
CN110633076B (zh) * | 2019-09-16 | 2021-05-04 | 杭州趣链科技有限公司 | 一种自动生成Solidity智能合约Java客户端程序的方法 |
CN112100064B (zh) * | 2020-09-02 | 2023-06-02 | 中国联合网络通信集团有限公司 | 基于区块链的软件购买方法、认证节点及购买方节点 |
CN115061779B (zh) * | 2022-06-16 | 2023-12-15 | 科东(广州)软件科技有限公司 | 一种用户态虚拟机的内核锁管理方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100079488A1 (en) * | 2008-09-30 | 2010-04-01 | Rockwell Automation Technologies, Inc. | Industrial automation visualization schemes employing overlays |
US20100192130A1 (en) * | 2009-01-29 | 2010-07-29 | Microsoft Corporation | Automated verification of a type-safe operating system |
CN103559238A (zh) * | 2013-10-25 | 2014-02-05 | 华东师范大学 | 一种多复用智能卡形式化建模与验证方法 |
CN106708525A (zh) * | 2016-12-27 | 2017-05-24 | 西安电子科技大学 | 一种基于Coq的MSVL程序验证方法 |
Family Cites Families (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9883008B2 (en) * | 2010-01-15 | 2018-01-30 | Endurance International Group, Inc. | Virtualization of multiple distinct website hosting architectures |
US8732720B2 (en) * | 2011-12-22 | 2014-05-20 | Hewlett-Packard Development Company, L.P. | Job scheduling based on map stage and reduce stage duration |
US9191435B2 (en) * | 2012-08-23 | 2015-11-17 | TidalScale, Inc. | Selective data migration or remapping of virtual processors to provide required data accessibility to processor cores |
US9774401B1 (en) | 2013-07-15 | 2017-09-26 | Paul Borrill | Entangled links, transactions and trees for distributed computing systems |
US9690709B2 (en) * | 2014-07-14 | 2017-06-27 | Oracle International Corporation | Variable handles |
US10210606B2 (en) * | 2014-10-14 | 2019-02-19 | Kla-Tencor Corporation | Signal response metrology for image based and scatterometry overlay measurements |
US9916170B2 (en) * | 2015-12-30 | 2018-03-13 | Vmware, Inc. | Cloud computing simulator |
US20170287090A1 (en) * | 2016-03-31 | 2017-10-05 | Clause, Inc. | System and method for creating and executing data-driven legal contracts |
US10339246B2 (en) * | 2016-05-26 | 2019-07-02 | Synopsys, Inc. | Schematic overlay for design and verification |
US10579421B2 (en) * | 2016-08-29 | 2020-03-03 | TidalScale, Inc. | Dynamic scheduling of virtual processors in a distributed system |
CN115589332A (zh) * | 2017-04-28 | 2023-01-10 | 数据翼股份有限公司 | 在去中心化系统中实施集中式隐私控制的系统和方法 |
US11294641B2 (en) * | 2017-05-30 | 2022-04-05 | Dimitris Lyras | Microprocessor including a model of an enterprise |
US10325116B2 (en) * | 2017-06-30 | 2019-06-18 | Vmware, Inc. | Dynamic privilege management in a computer system |
US10671377B2 (en) * | 2017-07-13 | 2020-06-02 | Vmware, Inc. | Method to deploy new version of executable in node based environments |
US10970449B2 (en) * | 2017-09-20 | 2021-04-06 | International Business Machines Corporation | Learning framework for software-hardware model generation and verification |
CN112119423A (zh) | 2017-11-28 | 2020-12-22 | 耶鲁大学 | 形式化验证的系统和方法 |
CN108664650B (zh) * | 2018-05-17 | 2020-05-22 | 百度在线网络技术(北京)有限公司 | 一种区块链网络的事务处理方法、装置、设备及存储介质 |
CN108985073B (zh) * | 2018-07-18 | 2020-05-22 | 成都链安科技有限公司 | 一种高度自动化的智能合约形式化验证系统及方法 |
US10754952B2 (en) * | 2018-07-23 | 2020-08-25 | Vmware, Inc. | Host software metadata verification during remote attestation |
US10896149B2 (en) * | 2018-07-29 | 2021-01-19 | International Business Machines Corporation | Composition operators for smart contract |
US10871989B2 (en) * | 2018-10-18 | 2020-12-22 | Oracle International Corporation | Selecting threads for concurrent processing of data |
US11194600B2 (en) * | 2019-01-16 | 2021-12-07 | Vmware, Inc. | Secure digital workspace using machine learning and microsegmentation |
US11176257B2 (en) * | 2019-08-13 | 2021-11-16 | International Business Machines Corporation | Reducing risk of smart contracts in a blockchain |
CN111311255B (zh) * | 2020-01-19 | 2023-07-25 | 杭州云象网络技术有限公司 | 一种基于预言机的智能合约形式化验证和纠错方法 |
US20210281510A1 (en) * | 2020-03-05 | 2021-09-09 | Deixis, PBC | High-resolution contract-based wireless network virtualization |
CN113872948A (zh) * | 2020-08-31 | 2021-12-31 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和节点设备 |
-
2018
- 2018-11-28 CN CN201880087842.1A patent/CN112119423A/zh active Pending
- 2018-11-28 US US16/767,569 patent/US11409630B2/en active Active
- 2018-11-28 WO PCT/US2018/062883 patent/WO2019108676A1/en active Application Filing
-
2022
- 2022-07-12 US US17/862,480 patent/US11816018B2/en active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100079488A1 (en) * | 2008-09-30 | 2010-04-01 | Rockwell Automation Technologies, Inc. | Industrial automation visualization schemes employing overlays |
US20100192130A1 (en) * | 2009-01-29 | 2010-07-29 | Microsoft Corporation | Automated verification of a type-safe operating system |
CN103559238A (zh) * | 2013-10-25 | 2014-02-05 | 华东师范大学 | 一种多复用智能卡形式化建模与验证方法 |
CN106708525A (zh) * | 2016-12-27 | 2017-05-24 | 西安电子科技大学 | 一种基于Coq的MSVL程序验证方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112817599A (zh) * | 2021-01-27 | 2021-05-18 | 南京大学 | 软件函数形式语义及形式化证明脚本自动生成方法 |
CN112817599B (zh) * | 2021-01-27 | 2023-06-23 | 南京大学 | 软件函数形式语义及形式化证明脚本自动生成方法 |
Also Published As
Publication number | Publication date |
---|---|
WO2019108676A1 (en) | 2019-06-06 |
WO2019108676A8 (en) | 2020-06-04 |
US20220365862A1 (en) | 2022-11-17 |
US11816018B2 (en) | 2023-11-14 |
US20200387440A1 (en) | 2020-12-10 |
US11409630B2 (en) | 2022-08-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11816018B2 (en) | Systems and methods of formal verification | |
Kalra et al. | Zeus: analyzing safety of smart contracts. | |
Xu et al. | A practical verification framework for preemptive OS kernels | |
Blom et al. | Specification and verification of GPGPU programs | |
Barcelona-Pons et al. | Stateful serverless computing with crucial | |
Duffy | Concurrent Programming on Windows | |
de Vilhena et al. | A separation logic for effect handlers | |
Muller et al. | Competitive parallelism: Getting your priorities right | |
von Hanxleden | Deterministic concurrency: A clock-synchronised shared memory approach | |
Henrio et al. | Multiactive objects and their applications | |
Sheff et al. | Safe serializable secure scheduling: Transactions and the trade-off between security and consistency | |
Dongol et al. | Contextual trace refinement for concurrent objects: Safety and progress | |
Prokopec | Learning Concurrent Programming in Scala | |
Daggett | Expert JavaScript | |
Forbes | Learning Concurrency in Python | |
Srinivasan | Kilim: A server framework with lightweight actors, isolation types and zero-copy messaging | |
Cortiñas et al. | Securing asynchronous exceptions | |
Grahl | Deductive verification of concurrent programs and its application to secure information flow for Java | |
Bruns | Deductive verification of concurrent programs | |
Amighi et al. | Resource protection using atomics: Patterns and verifications | |
Lucas | On the use of hierarchical task for heterogeneous architectures | |
Geeraerts et al. | On the verification of concurrent, asynchronous programs with waiting queues | |
Gouicem | Thread scheduling in multi-core operating systems: how to understand, improve and fix your scheduler | |
Kim et al. | ThreadAbs: A template to build verified thread-local interfaces with software scheduler abstractions | |
He | Translating hierarchical predicate transition nets to CC++ programs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |