用于调试存储器一致性模型的系统和方法

文档序号:6351085阅读:252来源:国知局

专利名称::用于调试存储器一致性模型的系统和方法
技术领域
:本发明涉及程序分析,更具体地涉及用于分析存储器模型的系统和方法。
背景技术
:在多线程共享存储器系统中,存储器一致性模型或存储器模型是程序员和编程环境之间的约定(contract)。存储器模型指定对共享位置访问的行为,并且具体地,指定由每个读取访问观测的值。硬件接口处(更近地,编程语言级别)存在大量关于模型的工作。最直观的存储器模型是顺序一致性模型,其类似于在顺序设置中的存储器行为。这需要所有访问表现为按照每个线程的程序顺序每次执行一个。这样的简化会带来代价顺序一致性禁止许多记录器指示的编译器和硬件优化,这是因为,它在访问中强制执行严格的次序(order)。已经提出许多缓解这些限制的宽松存储器模型,在易于编程和允许编译器以及硬件优化之间取得平衡。然而,这些附加的复杂性使宽松存储器模型难以推断(reasonabout)ο
发明内容用于分析关于存储器模型的测试程序的系统和方法包括将测试程序预处理为中间形式,并且将测试程序的中间形式转换为关系逻辑表示。关系逻辑表示与存储器模型组合,以产生合法性公式。在搜索存储器模型的空间中或者在合法性公式的核心上计算界限(bound)的集合。这解决了由合法性公式和界限的集合定义的关系可满足性(satisfability)问题,以判定测试程序的合法轨迹(trace)或者调试内存模型。用于分析关于存储器模型的测试程序的系统包括配置为执行并分析存储于存储器中的程序的处理器。处理器接收转换为中间形式的测试程序和存储器模型作为输入。转换模块存储于存储器中并且使用处理器而执行。转换模块配置为使用转换功能将测试程序的中间形式转换为测试程序的关系逻辑表示。存储于存储器中并使用处理器执行的约束汇编器(assembler)配置为将关系逻辑表示与存储器模型组合,以产生合法性公式。存储于存储器中并使用处理器执行的界限汇编器配置为在搜索存储器模型的空间中或者在合法性公式的核心上计算界限的集合。求解器(solver)配置为求解由合法性公式和界限的集合定义的关系可满足性问题,以实现判定测试程序的合法踪迹以及调试存储器模型中的至少一个。这些以及其它特性和优点将从以下结合附图阅读的其图示实施例的详细描述中而变得显而易见。本公开将参照附图在以下优选实施例的说明中提供细节,附图中图1是示出根据一个图示实施例的用于分析和调试存储器模型的系统/方法的框图/流程图2A是用于测试存储器一致性模型的样本测试程序的示意符号(notation);图2B是用于测试图2A的存储器一致性模型的样本测试程序的注释(annotate)Java编石马;图3是关系逻辑中的顺序一致性公式列表;图4是修正Java存储器模型(JMM)的关系逻辑公式列表;图5是示出在图4的修正JMM下有合法执行的图2的测试程序的证据;图6是用于问题F(P,Μ)的约束的最小核心,其中P是图2的程序,并且M是图3中的顺序一致性模型;图7是示出根据一个图示实施例的用于分析和调试存储器模型的系统的框图;图8是关系逻辑算符列表;图9是根据本原理的注释Java编码的代码列表与示出程序P的中间表示的图;图10示出用于图9的中间表示中的语句(statement)的语法;图11示出根据本原理将中间表示转换为关系逻辑所采用的转换函数T;图12A示出部分函数L,V和G;图12B示出关系表示R(P)=(|I(P),L,V,G|);图13示出根据本原理的约束汇编函数F;图14示出根据本原理的用于计算全域(universe)和界限的工具所采用的函数列表;图15示出根据本原理用于计算对语句的行为分配的COMPUTE-ACTS过程;以及图16是用于图9中所示的程序的acts(动作)映射以及上限。具体实施例方式存储器模型由于其复杂性而难以推断。存储器模型需要在易于编程和允许编译器以及硬件优化之间取得平衡。根据本原理的自动工具帮助调试和推断存储器模型。该工具用通过约束的集合、以及包含断言(assertion)的多线程测试程序照公理(axiomatically)描述的存储器模型作为输入,并且如果可以找到一个用于满足断言的程序轨迹,则输出该程序轨迹。该工具是完全自动的,不需要来自用户的指导并且基于可满足性(例如SAT)求解器。如果该工具无法找到轨迹,则其输出不可满足的约束的最小子集。这种特性帮助用户调试存储器模型,这是因为,它示出哪些约束导致测试程序不具有满足其所有断言的执行。本原理不仅为定义公理类型(axiomaticstyle)中的存储器模型提供可扩展的框架,还提供采取以断言以及存储器模型作为输入的测试程序、并且找到满足断言的轨迹(在可以找到一个的情况下)的工具。否则,该工具输出不可满足的核心,其示出哪些约束妨碍了断言被满足。本领域技术人员将认识到,本发明的各方面可以作为系统、方法或计算机程序产品而实现。因此,本发明的各方面可以采取完全硬件实施例、完全软件实施例(包括固件、常驻软件、微码等)、或者结合软件和硬件方面的实施例的形式,此处可以全部统称为“电路”、“模块”或“系统”。此外,本发明的各方面可以采取在一个或多个其上实施计算机可读程序代码的计算机可读介质中实施的计算机程序产品的形式。可以使用一个或多个计算机可读介质的任何组合。计算机可读介质可以是计算机可读信号介质或计算机可读存储介质。计算机可读存储介质例如可以是但不限于电子、磁、光、电磁、红外或半导体系统、装置或设备,或前述的任何合适的组合。计算机可读存储介质的更具体的示例(非穷举列表)将包括以下具有一个或多个接线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦可编程只读存储器(EPR0M或闪存)、光纤、便携式压缩盘只读存储器(CD-ROM)、光存储设备、磁存储设备、或前述的任何合适的组合。在此文档的上下文中,计算机可读存储介质可以是任何有形介质,其可以包含或存储用于指令执行系统、装置或设备使用的或与其一起使用的程序。计算机可读信号介质可以包括其中实施计算机可读程序代码的传播的数据信号,例如,在基带中或作为载波的一部分。这样的传播的信号可以采取各种形式的任何一种,包括但不限于电磁、光、或其任何合适组合。计算机可读信号介质可以是非计算机可读存储介质的任何计算机可读介质,其可以传递、传播、或传输用于指令执行系统、装置或设备使用的或与其一起使用的程序。在计算机可读介质上实施的程序代码可以使用任何合适的介质传送,所述介质包括但不限于无线、有线、光纤线缆、射频等,或者前述的任何合适的组合。用于执行本发明的各方面的操作的计算机程序代码可以用一个或多个编程语言的任何组合编写,所述编程语言包括面向对象的编程语言(诸如Java、Smalltalk,C++等)以及传统的过程编程语言(诸如“C”编程语言或类似的编程语言)。程序代码可以全部在用户的计算机上执行,部分在用户的计算机上执行,作为独立运行的软件包执行,部分在用户的计算机上部分在远程计算机上执行,或者完全在远程计算机或服务器上执行。在后一情形中,远程计算机可以通过任何类型的网络(包括局域网(LAN)或广域网(WAN))连接到用户的计算机,或者可以连接到外部计算机(例如,通过使用互联网服务提供商的互联网)。下面参照根据本发明的实施例的方法、装置(系统)和计算机程序产品的流程示和/或框图描述本发明的各方面。将理解到,可以通过计算机程序指令实施流程示和/或框图的每个块以及流程示和/或框图中的各块的组合。可以将这些计算机程序指令提供给通用计算机、专用计算机、或者其它可编程数据处理装置的处理器,以产生机器,使得经由计算机或其它可编程数据处理装置的处理器执行的指令创建用于实施流程图和/或框图块中指定的功能/动作的装置。这些计算机程序指令也可以存储于计算机可读介质中,其可以指引计算机、其它可编程数据处理装置或其它设备以特定的方式工作,使得存储在计算机可读介质中的指令产生制造产品,其包括实施流程图和/或框图的块中指定的功能/动作的指令。计算机程序指令也可以加载到计算机、其它可编程数据处理装置或其它设备中,以使得在计算机、其它可编程装置或其它设备中执行一系列操作步骤,以产生计算机执行的过程,使得在计算机或其它可编程装置上执行的指令提供用于实施流程图和/或框图的块中指定的功能/动作的过程。附图中的流程图及框图示出根据本发明的各种实施例的系统、方法及计算机程序产品的可能实施方式的架构、功能性及操作。就此而言,在流程图或框图中的每块可表示代码的模块、片段或部分,其包含用于实施指定的逻辑功能的一个或多个可执行指令。也应注意的是,在某些替代实施方式中,块中所述的功能可能不以图中所指出的顺序发生。例如,取决于所涉及的功能性,连续示出的两个块实际上可以基本上并发执行,或者各块有时可以相反顺序执行。也应注意的是,框图和/或流程示的每块及框图和/或流程示中的各块的组合可以通过执行指定功能或动作的基于专用硬件的系统实施,或通过专用硬件与计算机指令的组合来实施。现在参考附图,其中相同的标号表示相同或相似的元件,首先参考图1,自动的存储器一致性工具10调试并且推断存储器模型。该工具10采用由约束的集合14、以及包含断言18的多线程测试程序16所描述的存储器模型12作为输入,并且如果可以找到一个用于满足断言的程序16的轨迹20,则输出该轨迹20。断言18的作用是根据所考虑的存储器模型12,表达是否准许给定程序点上的给定值的计算。该工具10完全是自动的,不需要来自用户的指导并且基于SAT求解器22。将测试程序16转换为以描述存储器模型12的约束汇编的约束。根据SAT求解器22,如果组合的结果是可满足的,那么已经找到满足的轨迹或证据(witness)。否则,该工具10输出不可满足的约束的最小子集M,称为不可满足的核心。不可满足的核心可以帮助用户调试存储器模型12,这是因为,它示出哪些约束妨碍了测试程序中的断言18被满足。如果测试程序不包含循环,则工具10的结果为合理(sound)并完整(complete),意味着不存在虚假(spurious)的证据,并且如果证据存在,则找到它。如果工具10使用低近似(under-approximation),则它可能遗失证据,所以它合理但并不完整。然而实际上,我们发现多数用于存储器模型12的测试不包含循环。我们的案例调查显示,工具10可以用于针对不同存储器模型迅速并容易地运行多线程测试的情况。先前的检验存储器模型的方法包括定理(theorem)证明、模型检验、约束求解、以及逻辑编程。不同于多数技术,本工具10不限定于特定的存储器模型。我们有用于指定新模型的很好地定义的接口,并且支持可以关于少数简单关系的约束定义的任何存储器模型。本方法不同于先前的框架在于,我们支持公理类型的规范,并且工具10可以处理目前的模型版本。本方法准许存储器模型的快速原型法(prototyping)用户可以迅速看到改变对测试的影响,并且如果存在任何需要改变以获得期望行为的约束,则不可满足的核心帮助识别是哪些约束。将工具10设计为用于指定、测试以及调试存储器模型12的可扩展框架。工具10采取有一个或多个断言18、关系逻辑中的存储器模型12的规范(specifcation)、以及一组代码有限化(finitization)参数(诸如展开循环的次数以及用于表示整数的位向量的长度)的多线程测试程序16作为输入。测试程序16接着被有限化(通过展开循环、内联(inlining)方法调用、以及将整数替换为位向量)并转换为关系逻辑。所得到的约束与存储器模型约束组合,并递交到基于SAT的约束求解器22。如果组合的约束是可满足的,则就由存储器模型12定义的关系而言,可以说程序16关于存储器模型12是合法的,并且工具10的输出是合法性的具体证据。否则,可以说程序16是不合法的,并且输出是不合法性的证明,表达为组合约束的最小不可满足核心。测试程序(16):由(固有(implicit))初始化线程和两个或更多个用户线程组成的测试程序。首先执行初始化线程,将默认值写入程序中引用的所有共享存储器位置。用户线程在初始化结束之后执行,按照用户指定的并行或部分有序(partialorder)运行。程序在包括控制流结构、同步结构(其在给定监视器上产生锁定和解锁指令)、方法调用、字段和数组访问、整数和布尔运算、以及断言的Java的子集中编码。参照图2A和2B,工具10(图1)接受标准示意符号(图2A)和注释Java程序(图2B)这两种中的来自Manson等(“TheJavaMemoryModel”,POPL,05,pages378-391,2005)的测试程序。程序分别由三个线程组成将默认值写入共享存储器位置的初始化线程和两个并行执行的用户线程。在示意符号(图2A)中,并行运行的线程由竖线分隔,部分有序地执行的线程由横线分隔。在Java编码(图2B)中,固有静态初始化方法保存用于初始化线程的代码,而以“Othread”注释的方法保存用于用户线程的代码。在两种编码中,变量χ和y是指共享存储器位置,而rl和r2是指本地线程寄存器(thread-localregister)。存储器模型规范当测试程序执行时,其执行存储器相关的操作或行为的有限集合。行为属于一个线程并且具有以下行为种类之一线程开始、线程结束、易失读取、易失写入、常规读取、常规写入、锁定、解锁、以及特殊行为。读取、写入、锁定和解锁行为通过执行读取、写入和同步指令而产生。线程开始和结束行为标记线程的起始和终止,并且不与任何指令对应。特殊行为通过对在给定的存储器模型的定义中被指定为“特殊”的方法的调用而产生。例如,Java存储器模型(JMM)将所有I/O方法指定为特殊,并且调用这些方法影响存储器操作的次序。行为的种类及其所属的线程是工具10由程序文本推断的静态属性。在我们的框架中,这些属性给定为关系常量,即,其含义为元组集合的常量。例如,程序控制流程图中的行为的相对顺序由二进制关系C0建模。用于图2中的程序的Co的值是集合{(sO,aOl),(aOl,a02),(a02,eO),(si,all),(all,al2),(al2,el),(sO,a21),(a21,a22),(a22,e2)},其中aij表示由第i个线程的第j个指令产生的行为,而si和ei表示第i个线程的开始和结束行为。工具10自动填充关系常量,并将它们提供给用户,作为用于指定关于存储器模型的约束的基本块。程序的运行时间属性给定为关系变量集合,其共同定义该程序的执行。执行是E=(|A,W,V,l,m,0n,....,0f|)结构,其中A表示所执行的程序行为的子集,可见写入关系(write-seenrelation)W将每个执行的读取行为映射到该读取可见其值的写入,写入值关系(value-writtenrelation)V将每个写入行为映射到写入的值,访问位置关系(location-accessedrelation)1将每个读取和写入映射到它所访问的存储器位置,以及所用监视器关系(monitor-usedrelation)m将每个锁定和解锁映射到与它相关联的监视器。执行的定义也可以包括对于给定的存储器模型特定的A中的任何数量的次序关系Oi(例如,以前发生的关系)。将存储器模型指定为描述程序的关系常量和描述执行的关系变量中的约束集合。约束在关系逻辑(即,具有量词、关系和传递闭包的一阶逻辑)中指定。该逻辑的一个特性是它不在标量、集合和关系之间进行区分。具体地,集合作为一元(unary)关系,并且标量作为单元素集(singleton)—元关系。示例顺序一致性顺序一致性(SC)是易懂的存储器模型,其只需要所有执行的行为表现为与程序顺序一致的(弱)全序(totalorder)。图3示出不同步的顺序一致性的关系规范,如Yang等人所正式化的("Nemos:aframeworkforaxiomaticandexecutablespecifcationsofmemoryconsistencymodels,,,inIPDPS'04,pages26-30,2004)。常量以sans-serif字体显示,逻辑关键字以roman字体显示,变量以italics字体显示。表达式r[x]表示χ在r下的关系图像,其中r是二进制关系而χ是标量(或者,在关系逻辑中,单元素集一元关系);r[x,y]表示仅当关系r将χ映射到y时才评价为真的公式;并且r+表示r的传递闭包(transitiveclosure)。算符“One”将其论据(argument)关系约束为恰好包含一个元组(tuple)。我们定义了关于执行结构E=(|A,W,V,l,m,ord|)、以及程序常量co、to、t、读取(Read)和写入(feite)的顺序一致性。变量ord建模所执行的行为A的次序(ordering);常量t将程序中的每个行为映射到执行它的线程;常量“to”表示线程中的部分执行顺序;以及Reac^nfeite分别建模其行为种类是读取或写入的程序中的所有行为。图3中的前三个公式将ord约束为弱全(weaklytotal)、不对称(asymmetric)禾口传递(transitive)。第四和第五个公式指定了其与程序顺序和线程执行顺序是一致的。第六个公式将W约束为从执行的读取到执行的写入的函数,并且与访问位置关系一致。第七和第八个公式要求W与ord—致读取k不可见在aid关系中跟随其后的写入,并且到1DO的写入不(由ord)排序在W[k]和k之间。示例Java存储器模型Java存储器模型(JMM)使用“提交语义”指定对于给定程序合法的行为。如果一个执行可以从根据以下规则构成的程序的一系列推测执行推导出,则该执行合法。该系列中的第一个执行是“行为良好的(well-behaved)”:这个读取仅可见在其之前发生的写入。此前发生的次序(hb)根据由同步结构所暗示的程序顺序(pa)和同步(synchronizes-withXsw)顺序在执行中将读取和写入传递相关。该系列中留下的执行通过“提交”以及执行数据竞争(race)而从初始的行为良好的执行推导出。在每个执行之后,选择一个或多个来自这个执行的数据竞争,并且记忆或“提交(commit)”在这些数据竞争中涉及的读取和写入。该提交的数据竞争接着在下一个执行中执行该执行中的每个读取必须被提交并且通过竞争见到提交的写入,或者必须通过之前发生的关系见到写入。提交的写入也被执行,并且其写入提交的值。任何通过这个处理可实现的执行在JMM下都是合法的。图4表示修正的JMM的关系正式化(formalization)。JMM执行E=(|Ai,Wi,Vi,Ii,Hli,POi,SO^hbi,SWiD包括四个次序关系po、SO、hb、SW。关系PO建模程序顺序,其全部在单线程的行为上,并且其不使来自不同线程的行为相关;SO是A中的所有同步行为(S卩,锁定、解锁、线程开始和线程结束行为)的总顺序;SW由元组仏,b)组成,使得a为给定监视器上的解锁并且b为锁定,或者a为共享存储器中的给定易失性位置上的写入并且b为读取;以及lib为poUsw的传递闭包。如果一个执行的构成关系满足修正的JMM的定义7(为了简化而在此省略),则该执行构成良好(well-formed),由TOLL-FORMED(E)表示。如果存在集合Ci的有限序列(其中O彡i彡k)以及满足图4中的约束的构成良好的执行E^lA^i,Vi,Ii,mi;p0i,so,,hbi;SwiI)的有限序列,则构成良好的执行E是合法的。推测的执行的数目上限(表示为k)可以作为输入提供给工具10,或者工具10将从程序文本中计算合理的k。图4中的符号0表示域约束,并且所有其它符号具有其以前定义的或标准的含义。合法性证明(证据):给定测试程序P和存储器模型M,工具10产生该形式的合法性公式F(P,Μ)F(八幻(尸,幻八八^尸^我如拟乂瓦马,…石),其中k>ο;F(ρ,E)仅当执行E涉及P的线程内(intra-thread)语义时为真;Fa(P,Ε)仅当E满足P中的所有断言时为真;并且Mp(E,E1,...,Ek)仅当构成M的约束关于描述P的常量和定义E,E1,...,Ek的变量被满足时为真。对于未关于推测的执行指定的存储器模型,F(P,M)简化为F(P,E)~Fa(P,Ε)"Mp(E)ο公式F(P,Μ)的模型是将关系值(即,元组集合)分配到EJ1,…,&中的变量,使公式中的每个约束为真。如果这个分配存在,则这个分配是P中的至少一个执行关于M合法、并且满足P中的所有断言的具体证据。包括用于工具10的模型的元组从由工具基于程序文本的计算的符号值和有限化参数的值的有限集合或者全域中得到。程序P的全域由六种符号值组成1)可以由P分配的堆对象(heapobject)(注意用于有限化的测试程序P的堆必然是有限的其大小的合理上限可以通过计数P中的对象分配(即,新的)语句而简单地计算);2)P内引用的位置(字段);3)可以由P执行的存储器行为;4)包含P的线程;5)用于表示整数的比特值;6)真和假的布尔值。参照图5,图示性地示出了阐述图2中的程序关于修正JMM(图4)的合法性的证据。为了可读性,工具10(图1)显示由约束求解器22产生的模型12的格式化的片段,而不是从变量到值的整个分配。像以前一样,符号值aij表示由第i个线程的第j个指令产生的行为,并且si和ei表示第i个线程的开始和结束行为。所执行的行为的集合A(或Ai)中的每个行为用它的行为种类注释。读取和写入行为用它们访问的位置和它们读取或写入的值额外地加以注释。例如,集合A1中的行为all上的注释“read(X,0)”意味着all是从字段χ对值0进行的读取(S卩,V1[W1[all]]=0并且Uall]=χ)。部分示出分配到次序的值(诸如WO;我们在图5中仅显示其传递缩减(reduction)的元组。操作上,如下证明图5中的执行E合法。我们以行为良好的执RE1开始,其中每个读取可见在其前发生的写入。具体地,线程tl对χ的读取和线程t2对y的读取二者都可见对于这些位置的初始写入0。执行E1有两个数据竞争行为all和a22形成χ上的数据竞争,并且行为al2和a21形成y上的数据竞争。我们现在可以提交来自一个数据竞争或这二者的写入。工具10选择提交这二者,并将C1设置为{al2,a22}。接着,下一个执行E2执行所提交的写入。注意,al2,a22GA2,并且其中的每个将1写入其各自的位置。由于没有读取被提交到C1,因此读取氏再次见到默认写入。在第二步中,我们将读取和所有其它行为提交到C2。最终的执行E执行来自C2的行为,其中,每个提交的读取可见通过数据竞争的相反线程中的1的写入。非法性证明(最小核心)没有模型的公式被称为不可满足。对于工具10的公式F(P,M)的不可满足性表示(有限化的)程序P不具有关于M合法并且也满足P中的所有断言的执行。如果工具10的用户期望P关于M是合法的,则证据的缺乏指示在M的规范、或P的编码或者有限化参数的设置中的错误(bug)。但是即使预期P是非法的,单独的F(P,Μ)的不可满足性也不能充分指示M和P是没有错误的。例如,公式可能是轻微不可满足的,因为M是无解的(不允许任何P的执行)。为了帮助理解非法性原因,工具10对每个不可满足的公式F(P,Μ)输出最小不可满足核心。不可满足的核心是公式约束的其本身是不可满足的子集。每个这样的子集包括一个或多个关键约束,其不能在使得核心的剩余部分可满足的情况下被移除。如果有非关键约束,则其与不可满足性无关,并且通常会减少核心的诊断效用(utility)。仅包括关键约束的核心被称为最小的。图6中图示性地示出根据本原理由工具10产生的最小核心的示例。从F(P,M)=F(P,Ε)"Fα(P,Ε)"Mp(E)中得到由六个约束组成的核心,其中P是图2中的程序并且M是顺序一致性。注意,工具10关于变量aij编码F(P,M)和Fa(P,M),变量aij的每个都被约束以对当执行第i个线程的第j个指令时由E产生的行为(如果有的话)进行评价。图6中的前两个约束从F(P,Ε)中得到,并且编码图2Β中的第2、3行中的指令的含义。下面两个约束来自于Fa(Ρ,Ε),并且编码第8和14行的断言。其余的约束从图3的第1、3、4和7行中的Mp(E)的定义得到。我们希望图1和图2中的测试程序16的所有的顺序一致的执行都在断言失败时结束,这是因为,程序指令的所有交错都会导致至少一个读取可见零值。为了得到合法的(即,非失败的)SC执行,我们将会如下修改图2Β中所示的P将由初始写入所写入的值改变为1(2-3行);或者具有期望读取0的断言(8-14行);或者在一个用户线程中交换读取和写入指令(6-7、12-16行)。图6中的核心反映了这些,确认存储器模型和程序行为二者都满足预期。根据该核心,F(P,M)是不可满足的,因为所有初始写入都写入0;所有断言都期望1;所有行为都需要按照与CO—致的全序执行(在这种情况下,这意味着至少一个读取必须在非初始写入之前发生在相同的位置);并且没有一个读取可以观测到无序(out-of-order)的写入。参照图7,其示出了根据一个实施例的工具10的图示性系统实施例。测试程序P和存储器模型M的分析涉及以下模块的分级(staged)应用。将处理器202或处理器组配置为预处理程序P。处理器202与存储器210结合在一起工作,以有限化P并将其转换为中间形式I(P)。转换器204可以存储于存储器210中并且可以使用相同或不同的处理器实施。转换器204将I(P)转换为关系表示R(P)。可以存储于存储器210中并且可以使用相同或不同的处理器实施的约束汇编器206组合R(P)和M以产生合法性公式F(P,M)。可以存储于存储器210中并且可以使用相同或不同的处理器实施的界限汇编器208在搜索模型的空间或合法性公式F(P,M)的核心上计算界限集合B(P,M)。可以存储于存储器210中并且可以使用相同或不同的处理器实施的约束求解器212求解由F(P,M)和B(P,M)定义的关系可满足性问题,或者产生示出为什么不能找到解的最小核心。根据本原理提供转换器204、约束汇编器206、以及界限汇编器208。预处理和求解可以使用已知的用于程序分析库和约束求解器的模块。本方法用于关系逻辑,其用关系代数和带符号的位向量算术扩展一阶逻辑。这个逻辑是关系从原子的共同广域中得到的长度相等的元组集合。原子可以表示整数或未解释的符号值。关系的元数(arity)确定它的元组的长度,该元数可以是任何正整数。我们称一元关系(即元数为1的关系)为“集合”,并且称单元素集一元关系为“标量”。图8中图示性示出的逻辑的内核包括标准位向量算符、一阶逻辑的连接(connective)和量词(quantifer)、以及关系代数算符。最后一项包括关系联结(join)(.)、积(一)、覆写(W并集(U)、交集(H)、差(\)、以及传递闭包(+)。两个关系的联结是其元组的成对的联结,其中〈a0,···,ak).〈ak,···,an)广生〈a0,···,ak—”ak+1,···,an〉。我们可替换地使用e、r和r[e]以代表e和r的联结。两个关系的积是其元组的成对的积,其被定义为(a0,...,ak)—(am,...,an)=(a0,...,ak,am,···,an〉。覆写表达式rW{<a,bL,...5bn)}产生r的变体,其中所有以a开始的元组由仏,、...,bn)代替。公式单独的Expr和一个Expr对于至多一个元组和恰好一个元组的关系分别为真。基数表达式|r|给出作为位向量的r中的元组的个数;bits(r)计算代表集合作为位向量的r中整数的原子总和;以及Bits(V)评价hΦ0的整数原子21的集合,其中ν是位向量by..bk。所有其它表达式和公式都有其标准含义。预处理(202)将测试程序P转换为关系逻辑,工具10首先通过展开所有循环以及内联所有方法调用来有限化P的代码。接着将有限化的代码转换为捕获其数据、控制和同步依赖性(cbpendency)的中间形式。P的中间形式为I(P)=(|efg,guard,pointsTo,maySee|)结构,其中efg表示P的扩展控制流图;guard将efg中的每个指令映射到保护其执行的控制条件;pointsTo将每个变量映射到在运行时间其可以指向的堆对象(如果存在的话);以及maySee将efg中的每个读取映射到其可以观测的写入集合。I⑵的全部四个分量都使用标准分析(例如,使用WALA工具)来计算。图9中示出了I(P)的示例,其示出注释Java编码240和中间形式的P的扩展控制流图250。P的扩展控制流图250是P的线程的控制流图的并集,其中,其执行为部分有序的线程的出口和入口块之间有附加的边缘。图250的节点包括图10中再现的静态单一分配(SSA)形式的WALA语句,其为变量的每个新定义给出新名称。变量定义使用Φ语句合并,并且堆访问表达为明确的读取和写入语句。名称ν,#表示指针变量。合成的(synthetic)开始和结束语句指示线程的开始和结束。我们定义guard函数如下在WALA语句上操作。guard(s,Vi)的值为s将Vi分配到Vj的条件,其中s是Vj=Φ(·.·,Vi,···)。转换(204)将预处理的程序I(P)转换为其关系表示R(P)依赖于采取WALA表达式并且返回关系表达式的转换函数TJExper—Expr(图11)。与顺序程序的关系编码不同,函数T不解释堆的访问。即,如果变量Vi由读取语句s定义,则T[[Vi]]是非约束的一元关系Pvi,其起到由s读取的值的占位符(placeholder)的作用。在顺序设置中,用于由读取所见的值的关系编码可以直接从程序文本中计算。然而在并行设置中,这些值由程序语义和存储器模型两者确定。占位符是我们的框架的特性,其允许我们将程序语义编码从存储器模型规范中分离T将关于占位符的程序语义编码,约束汇编器接着将其替换为由存储器模型指定的关系表达式。对于不是由堆的读取定义的表达式,函数T产生与顺序程序的在先编码相同的关系表达式。图11再现了这样的典型的样本。函数def采取SSA形式的变量并且返回定义其值的语句。真和假是恒定的一元关系,其值分别为原子的真和假。函数ε将公式和位向量转化为表达式,并且F和B做出反转(dothereverse)。所有整数和布尔运算使用其关系逻辑中的对应算符来转换。关系表示R(P)是(|I(P),L,V,G|)结构,其用部分函数L、V和G(图12A)捕获程序I(P)的语义。函数L将读取、写入、锁定和解锁映射到表示由这些语句访问的监视器或堆位置的关系表达式。如果s是静态字段f的读取或写入,则L[[s]]产生其值{<f>}由表示字段f的原子组成的常量关系fο如果S读取或写入实例字段f,则L[[s]]产生/UlfwJ]其值为两个一元元组的集合,其中一个表示字段f而另一个表示由Vref引用的对象。对于监12视(monitor)语句,L[[s]]产生对由s锁定或解锁的对象评价的表达式。函数V将写入和断言映射到其写入或断言的值的关系编码。函数G将其域内的每个语句s用到表示s的保护的关系公式。图12B示出用于图9中的程序的R(P)的示例。约束汇编(206)工具10使用图13中定义的递归(recursive)约束汇编过程,编码程序R(P)关于存储器模型Mp(E,E1,...,Ek)的合法性。约束汇编函数F包括辅助函数ops,其产生程序i(P)中的执行与存储器有关的操作的所有语句。函数asserts返回给定程序中的所有断言语句;vars返回由程序的语句定义的所有变量。算符执行句法代换(syntacticsubstitution),例如,feΘ{x^y}将公式或表达式fe中的所有自由出现的χ以y代替。过程F将关系表示R(P)和存储器模型规范Mp(E,E1,...,Ek)作为输入,并产生合法性公式F(P,Μ)。基本步骤F(s,Ei)对每个语句s和执行Eie{E,E1,...,Ej分配新的一元关系<以表示如果其执行了s则Ei执行的行为。函数σ(fe,Ei)用ViD^FWefG),Ei]]替换公式或表达式fe中的所有占位符关系Pv,其中Vi[Wi[F(def(ν),Ei]]是由读取所观测到的定义Ei的上下文中的变量ν的值。换句话说,σ的应用由存储器模型指定的值取代在转换阶段产生的占位符。递归步骤F(R(P),Ei)通过产生以下公式约束执行Ei以涉及R(P)的语义(1)由EjA行的语句可以执行至多一个行为;(2)当且仅当其在Ei的上下文中的保护为真时,语句执行行为;(3)如果执行不同的语句,则不同的语句必须执行不同的行为;(4)&的写入值(V》、访问位置(Ii)以及所用监视器(Hii)关系与由V和L给定的对应值一致;以及(5)由&执行的所有行为的集合(由Ai表示)是由执行的语句所执行的行为的并集。递归步骤F(s,R(P)1Ei)约束定义语句的执行的关系,以符合程序语义。步骤Fa仅应用于主要执行E,其约束E以满足P中的所有断言。界限汇编和求解(208):寻找汇编的合法性公式的模型或核心的分析的最后一个阶段指派给Kodkod约束求解器。Kodkod采取关系可满足性问题作为输入,该问题通过减小到布尔可满足性以及将SAT求解器应用到得到的布尔约束来求解。关系可满足性问题由关系逻辑中的公式、其中会解释公式的原子的全域、以及公式中每个关系的值的下限和上限组成。这些界限作为从所提供的全域中得到的元组集合而给出。上限Bu(r)指定关系r可以在公式的模型中包含的元组。下限碎(/O指定r必须包含的元组(如果有的话)。诸如关系CO(如上所述)的有相同的下限和上限的关系被称为常量。有不同的下限和上限的关系被称为变量。变量元组的总数(即Σ」Bu(r)W1(r)|)确定由Kodkod探索的搜索空间大小中的指数(exponent)。因此为了性能,需要最小化Bu(r)以及最大化&(r)。将呈现用于审慎地设置界限的算法,使得得到的搜索空间是紧凑的,并且包括所有潜在的证据。图14示出用于计算全域和界限的工具10的图示性函数,其与合法性公式F(R(P),Mp(E,E1,...,Ek))一起组成关系可满足性问题。为了简化陈述,我们仅示出用于由汇编器产生的关系4以及定义执行Ei的基本关系(Ai,WyVi,IiMi)的界限的推导。全域和界限二者都关于辅助函数acts(如下讨论)定义,该辅助函数将每个语句存储器相关的操作SeOPS(KP))映射到代表可能产生的执行的行为的原子集合。<的上限是从BCtS(S)得到的所有一元元组的集合。其下限是空的,除非s的保护是常量真并且acts(S)恰好具有一个行为原子。在这种情况下,α;的下限和上限是相同的;即,保证每AEi都执行s,并且因此执行行为acts(s)。Hii的上限将对应于监视语句s的行为原子映射到当执行s时可以被锁定或解锁的对象原子。Hii的下限仅当执行s时锁定或解锁的对象是静态已知时,才具有对actS(S)的映射;S卩,IpointsTo(ν)|=1,其中ν是对监视对象的引用。其它界限以类似的方式从acts以及P)得到。在图14中,计算对于合法性公式F(P,M)的全域(U)和界限(B1,Bu)。辅助函数threads返回代表给定的程序中的线程的对象集合;fields产生在程序的读取和写入语句中引用的字段集合;以及acts将程序中的每个存储器相关的语句s映射到当执行s时可以执行的(用符号表示的)行为集合。e表示空字符串,而b是由用户提供的整数有限化参数。图15中呈现用于计算acts函数的COMPUTE-ACTS过程。辅助函数restrict(cfg,i)将给定的cfg限制为第i个线程的控制图示;domain(m)产生所有由映射m映射的键值(key)集合;dominates(cfg,s,s,)(或postdominates(cfg,s,s,))仅当s在cfg中支配(或后支配)S,时为真;以及kind(S)返回种类语句S作为字符串(例如,“读取”、“写入”等)。COMPUTE-ACTS以如下方式一个线程接一个线程地工作。给定线程ti;我们使用函数1^¥将、的语句分成等价类(equivalenceclass)。例如,相同静态字段的两个读取具有相等的键值并且在相同的等价类中。这样,对于语句C的每个类,MAX-EXE⑶TABLE-SETS找到最大的子集CmaxSC,使得Cmax的所有元素通过ti的CFG(控制流图)在单一路径中出现。我们称Cmax中的语句是C的代表。随着对于每个C的Cmax的产生,REPRESENTATIVE-ATOMS对每个代表语句sij产生唯一的原子aij并且记录两者在映射中的对应关系。该映射的大小是、的任何执行可以产生的行为数目的上限,并且其由、中的存储器相关的语句的总数界定。COMPUTE-ACTS的最后几行使用代表映射为、中的所有s计算acts(S)。具体地,如果s是代表语句sij,或者如果s和sij可以产生相同的存储器事件(例如,字段的读取f)并且两个语句都不(后)支配、的CFG中的另一者,则acts(s)包含原子aij。图16中示出acts映射和得到的界限的示例。样本映射示出acts的三个显著属性,其确保我们的界限是紧凑的,并且不排除任何证据1、每个语句s都映射到至少一个原子;2、如果s和S’都可以在某些执行中执行,则它们的acts集合的并集包含至少两个原子;3、如果s和S’在线程的不同分支中,但是可以产生相同的存储器事件,则它们的acts的交集包含至少一个原子;以及4、如果s的执行暗示S’的执行,则它们的acts集合的交集是空的。前两个属性(1和2)确保了证据没有遗失,这是因为,搜索空间排除了执行某些语句或某些语句的组合的执行。例如,如果actS(S)对于一些S是空的,则关手《的上限和下限二者也是空的,其迫使求解器将<视为常量关系0。结果,满足合法性约束0的唯一途径是使s的保护评价为假。因此对于s的空的acts集合排除所有执行s的证据。同样地,如果actS(S)Uacts(s’)仅包含一个原子aij,则钱叙)=5,似)={<吨〉}。在这种情况下,满足合法性约束/7(5.,尽)01^’,五/)=0的唯一途径是将<或0丨,之一(或这二者)设置为空集,因而排除所有执行s和S,这二者的证据。第三个属性(3)确保了证据没有遗失,这是因为,存储器模型使由不同执行的上下文中的不同语句所执行的行为等同。例如,图9中的程序在Java存储器模型下是合法的。在其证据执行E中,图9的语句11从χ读取值1,其导致语句13执行并将值1写入y;即£A。执行ε由推测的执行E1证实合法,其中语句11从χ读取值0,导致语句14执行并将值1写入y;BP4£Λ。结果,推测提交将1写入y的唯一途径是提交执行的结果,但是在E中兑现这个提交的唯一途径是执行3。因此,我们必须使=‘,其意味着Bu(Q13)ηBu{alu)(以及扩展的acts(S13)ηacts(S14))必须是非空的。第四个属性(4)确保了搜索空间的紧凑。即,如果s的执行暗示S’的执行(即S后支配S’或S’支配s),则acts(s)和acts(s’)无需相交。我们因此可以使acts(s)ΠactS(S’)为空集,以获得更小的搜索空间而不丢失任何证据。为了确保没有证据丢失,考虑两个分配acts和CiCfe0,这二者除了Grfsf^ηacts(s')和acts,,(s)ηClCtS0(s‘)=0以外是相同的。对于每个由acts允许的执行Ei,存在由OCte0允许的等价#。首先,假设Ei执行S。由于s=>s’,所以Ei也必须执行s’。因此,,其可以由基于的界限满足。g卩,E^=尽。现在,假设EiR执行S’。再次满足η=0并且<=Ei。这显示出actsa绝不会排除涉及单一执行的证据。可以将类似的论据应用于涉及多个执行的证据。根据本原理,完全自动的工具(10)能够调试并推断存储器模型的公理规范。工具10用以检验JMM、JMM的修正版本、以及多个公知的硬件级别的存储器模型。这些实验事先确认测试程序的预期行为中的已知差异,并且发现新的差异。工具10是完全自动的,并且可以处理JMM目前的公理规范。已经描述了用于调试存储器一致性模型的系统和方法的优选实施例(其意图为图示性的并且不意图限定),应注意的是,在上述教导的指引下,本领域技术人员可以做出修改和变化。因此应该理解的是,在所披露的具体实施例中可以做出变化,其落入由所附权利要求概括的本发明的范围内。本发明具有如上描述的各方面,以及由专利法所要求的细节和特征,在权利要求中提出了要求权利和期望通过专利特许证被保护的内容。权利要求1.一种用于分析关于存储器模型的测试程序的方法,包括使用处理器将测试程序(P)预处理为中间形式(220);将所述测试程序的中间形式转换(204)为关系逻辑表示;将所述关系逻辑表示与存储器模型(M)组合(206),以产生合法性公式;在搜索所述存储器模型的空间或所述合法性公式的核心上计算(208)界限的集合;以及求解(212)由所述合法性公式和所述界限的集合定义的关系可满足性问题,以进行判定所述测试程序的合法轨迹以及调试所述存储器模型中的至少一个。2.如权利要求1所述的方法,其中如果在所述求解步骤期间没有解存在,则产生示出为什么不能找到解的最小核心。3.如权利要求1所述的方法,其中预处理测试程序包括有限化所述测试程序。4.如权利要求1所述的方法,其中所述中间形式包括所述测试程序的一个或多个扩展流程图的表达、指令到控制条件的映射、变量到堆对象的映射、以及观测到的读取语句到写入语句的映射。5.如权利要求1所述的方法,其中组合(206)包括将转换期间产生的占位符参数替换为由所述存储器模型存储的值,以将所述关系逻辑的执行约束到由所述测试程序定义的语义。6.如权利要求1所述的方法,其中求解(212)关系可满足性问题包括采用可满足性求解器。7.一种计算机可读存储介质,其包含用于分析关于存储器模型的测试程序的计算机可读程序,其中当在计算机上执行所述计算机可读程序时,导致所述计算机执行步骤将测试程序(P)预处理(202)为中间形式;将所述测试程序的中间形式转换(204)为关系逻辑表示;将所述关系逻辑表示与存储器模型组合(206),以产生合法性公式;在搜索所述存储器模型的空间或所述合法性公式的核心上计算(208)界限的集合;以及求解(212)由所述合法性公式和所述界限的集合定义的关系可满足性问题,以进行判定所述测试程序的合法轨迹以及调试所述存储器模型中的至少一个。8.如权利要求7所述的计算机可读存储介质,其中如果在所述求解步骤期间没有解存在,则产生示出为什么不能找到解的最小核心。9.如权利要求7所述的计算机可读存储介质,其中预处理(202)测试程序包括有限化所述测试程序。10.如权利要求7所述的计算机可读存储介质,其中所述中间形式包括所述测试程序的一个或多个扩展流程图的表达、指令到控制条件的映射、变量到堆对象的映射、以及观测到的读取语句到写入语句的映射。11.如权利要求7所述的计算机可读存储介质,其中组合(206)包括将转换期间产生的占位符参数替换为由所述存储器模型存储的值,以将所述关系逻辑的执行约束到由所述测试程序定义的语义。12.如权利要求7所述的计算机可读存储介质,其中计算(208)界限的集合包括通过将关系可满足性问题减小到布尔可满足性问题而求解所述关系可满足性问题。13.如权利要求7所述的计算机可读存储介质,其中求解(212)关系可满足性问题包括采用可满足性求解器。14.一种用于分析关于存储器模型的测试程序的系统,包括处理器(202),其配置为执行并分析存储器(210)中存储的程序,所述处理器接收转换为中间形式的测试程序(P)以及存储器模型(M)作为输入;转换模块(204),存储于存储器中并使用所述处理器执行,其配置为使用转换函数将所述测试程序的中间形式转换为所述测试程序的关系逻辑表示;约束汇编器(206),存储于存储器中并使用所述处理器执行,其配置为将所述关系逻辑表示与所述存储器模型组合,以产生合法性公式;界限汇编器(208),存储于存储器中并使用所述处理器执行,其配置为在搜索所述存储器模型的空间或所述合法性公式的核心上计算界限的集合;以及求解器(212),其配置为求解由所述合法性公式和所述界限的集合定义的关系可满足性问题,以进行判定所述测试程序的合法轨迹以及调试所述存储器模型中的至少一个。15.如权利要求14所述的系统,其中如果所述求解器(212)没有找到存在的解,则输出示出为什么不能找到解的最小核心。16.如权利要求14所述的系统,其中所述中间形式包括所述测试程序的一个或多个扩展流程图的表达、指令到控制条件的映射、变量到堆对象的映射、以及观测到的读取语句到写入语句的映射。17.如权利要求14所述的系统,其中所述约束汇编器(206)将转换期间产生的占位符参数替换为由所述存储器模型存储的值,以将所述关系逻辑的执行约束到由所述测试程序定义的语义。18.如权利要求14所述的系统,其中所述求解器(212)包括可满足性(SAT)求解器。全文摘要一种用于分析关于存储器模型(M)的测试程序(P)的方法和系统,包括将测试程序预处理为中间形式,以及将所述测试程序的中间形式转换(204)为关系逻辑表示。将所述关系逻辑表示与存储器模型(M)组合(206),以产生合法性公式。在搜索所述存储器模型的空间或者所述合法性公式的核心上计算(208)界限的集合。求解(212)由所述合法性公式和所述界限的集合定义的关系可满足性问题,以判定所述测试程序的合法轨迹或者调试所述存储器模型。文档编号G06F11/00GK102597961SQ201080050828公开日2012年7月18日申请日期2010年7月30日优先权日2009年11月10日发明者E.托拉克,J.多尔比,M.瓦齐里申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1