CN116069669A - 全自动分布式一致性的分析方法、系统、设备及存储介质 - Google Patents

全自动分布式一致性的分析方法、系统、设备及存储介质 Download PDF

Info

Publication number
CN116069669A
CN116069669A CN202310212470.3A CN202310212470A CN116069669A CN 116069669 A CN116069669 A CN 116069669A CN 202310212470 A CN202310212470 A CN 202310212470A CN 116069669 A CN116069669 A CN 116069669A
Authority
CN
China
Prior art keywords
state
code
application
path
smt
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.)
Granted
Application number
CN202310212470.3A
Other languages
English (en)
Other versions
CN116069669B (zh
Inventor
马凯
李�诚
张钏楠
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
University of Science and Technology of China USTC
Original Assignee
University of Science and Technology of China USTC
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by University of Science and Technology of China USTC filed Critical University of Science and Technology of China USTC
Priority to CN202310212470.3A priority Critical patent/CN116069669B/zh
Publication of CN116069669A publication Critical patent/CN116069669A/zh
Application granted granted Critical
Publication of CN116069669B publication Critical patent/CN116069669B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N5/00Computing arrangements using knowledge-based models
    • G06N5/04Inference or reasoning models
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明公开了全自动分布式一致性的分析方法、系统、设备及存储介质,它们是一一对应的技术方案,相关方案中:通过引入优化设计、并且可编码一致性语义的中间表达语言,将程序分析与一致性分析(弱一致性分析)解耦,从而大幅提高了分析的效率,使得分析现存的大中型网络应用程序成为可能,并且可以容许在程序分析中自由增加或混合不同的分析策略来处理不同的程序设计语言和高级开发框架,降低支持新语言或框架的技术成本;一致性分析时也可以根据具体输入自由选取不同的验证策略,提高分析效率;同时,通过本发明提供的方案使得多语言混合系统的分析成为可能。

Description

全自动分布式一致性的分析方法、系统、设备及存储介质
技术领域
本发明涉及分布式系统的一致性分析领域,尤其涉及一种全自动分布式一致性的分析方法、系统、设备及存储介质。
背景技术
近年来,随着互联网服务的发展,大规模应用程序分散部署在多集群、多数据中心中,已成为提升用户体验、增大可服务用户数的重要手段。而多站点的部署往往引入多站点间数据不一致的问题,即不同站点在不同时刻看到的系统数据不同。为了解决该问题,传统的解决方案是使用基于Paxos(一种基于消息传递且具有高度容错特性的共识算法)等共识算法的强一致性协议。但随着系统规模的不断扩大,强一致性模型逐渐成为可伸缩性、可用性等重要系统指标的瓶颈,因此众多弱一致性模型(如最终一致性、因果一致性等)逐渐得到应用。
如图1所示,弱一致性模型通过放弃强一致性模型的系统全局顺序保证换取操作顺序上的灵活度。该灵活度意味着系统可以以不同的顺序处理用户请求,而非固定的用户提交请求的时间顺序,从而大幅提升系统性能。根据分布式系统领域的 CAP(一致性-可用性-分区)定理,传统的强一致性模型下系统不能兼顾网络分区和可用性,弱一致性模型也去除了这方面的限制。但与此同时,弱一致性模型本身常常并不能提供应用程序正常工作所需的顺序保证,需要开发者手动在合适的地方手动插入数据同步代码,保证系统中关键操作执行的顺序。以银行账户管理系统(一种应用程序)为例(这样的系统往往部署在地理上分隔的数据中心中),储户在取钱时,必须保证取钱请求在整个系统中是以一定顺序执行的,否则某恶意储户可以同时向同一银行的不同数据中心发送取款请求,如果这些请求总额大于其账户余额,并且不同数据中心间没有及时同步余额变化,就有可能导致数据中心错误地认为该储户有足够的余额,并接受所有取款请求,进而导致银行的经济损失。
实践表明,在一个较大的应用程序中,查找出需要手动添加同步代码的操作是困难而繁琐的事情。以上述银行账户管理系统为例,除了取钱操作外,还应该有存钱、转账、创建新账户等等大量操作,这些都需要开发者人工确认一致性的有效性。因此,弱一致性的自动推理成为了开发者的迫切需求,并且尽量不涉及任何人工推理的成分。
目前已有的弱一致性自动推理方法有:(1)领域特定语言,要求用户使用特定程序设计语言描述应用程序操作逻辑,再由语言所提供的分析工具执行自动化的一致性分析;(2)程序分析器,在已有程序代码上执行程序分析,可能需要用户提供一部分程序规格说明,特别是应用程序的不变式。但是,以上两类方法均无法应用于现存的网络应用程序。原因在于,现存的网络应用程序往往具有代码量大、维护人手多、代码变动快的特点,代码量大使得重写应用程序往往不能实现,代码变动快意味着应用程序往往没有稳定的程序规格说明。此外,在实现上,现存的网络应用程序往往使用高级程序语言和具有高度抽象的开发框架,虽然给程序分析带来了机遇,但是也使得现有的程序分析工具无法作用于这些应用程序上。
因此,有必要提出一套可行的一致性方法,使得现存应用程序也可以受益于自动化的弱一致性分析,在保证数据一致性的同时提升应用程序的性能。
发明内容
本发明的目的是提供一种全自动分布式一致性的分析方法、系统、设备及存储介质,可以分析已有的网络应用程序的弱一致性需求,程序可以自动以最佳形式部署为PoR(Partial Order,偏序)一致的,且程序开发者也可以根据分析结果改进热点代码,进一步提升应用程序性能。
本发明的目的是通过以下技术方案实现的:
一种全自动分布式一致性的分析方法,包括:
读取应用程序的代码,使用程序分析技术,将代码中每一会影响应用程序状态的代码路径分别编码为中间表达语言;
将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为定理证明器能够识别的形式,再输入至所述定理证明器,通过所述定理证明器检查每一对会影响应用程序状态的代码路径是否能够并发执行,枚举完所有会影响应用程序状态的代码路径后,获得应用程序的弱分布式一致性分析结果。
一种全自动分布式一致性的分析系统,包括:
程序分析组件,用于读取应用程序的代码,使用程序分析技术,将代码中每一会影响应用程序状态的代码路径分别编码为中间表达语言;
一致性分析组件,用于将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为定理证明器能够识别的形式,再输入至所述定理证明器,通过所述定理证明器检查每一对会影响应用程序状态的代码路径是否能够并发执行,枚举完所有会影响应用程序状态的代码路径后,获得应用程序的弱分布式一致性分析结果。
一种处理设备,包括:一个或多个处理器;存储器,用于存储一个或多个程序;其中,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现前述的方法。
一种可读存储介质,存储有计算机程序,当计算机程序被处理器执行时实现前述的方法。
由上述本发明提供的技术方案可以看出,通过引入优化设计、并且可编码一致性语义的中间表达语言,将程序分析与一致性分析(弱一致性分析)解耦,从而大幅提高了分析的效率,使得分析现存的大中型网络应用程序成为可能,并且可以容许在程序分析中自由增加或混合不同的分析策略来处理不同的程序设计语言和高级开发框架,降低支持新语言或框架的技术成本;一致性分析时也可以根据具体输入自由选取不同的验证策略,提高分析效率;同时,通过本发明提供的方案使得多语言混合系统的分析成为可能。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
图1为本发明背景技术提供的一致性分布式系统示意图;
图2为本发明实施例提供的一种全自动分布式一致性的分析方法的示意图;
图3为本发明实施例提供的一种全自动分布式一致性的分析系统的示意图;
图4为本发明实施例提供的一种处理设备的示意图。
具体实施方式
下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
首先对本文中可能使用的术语进行如下说明:
术语“包括”、“包含”、“含有”、“具有”或其它类似语义的描述,应被解释为非排它性的包括。例如:包括某技术特征要素(如原料、组分、成分、载体、剂型、材料、尺寸、零件、部件、机构、装置、步骤、工序、方法、反应条件、加工条件、参数、算法、信号、数据、产品或制品等),应被解释为不仅包括明确列出的某技术特征要素,还可以包括未明确列出的本领域公知的其它技术特征要素。
术语“由……构成”表示排除任何未明确列出的技术特征要素。若将该术语用于权利要求中,则该术语将使权利要求成为封闭式,使其不包含除明确列出的技术特征要素以外的技术特征要素,但与其相关的常规杂质除外。如果该术语只是出现在权利要求的某子句中,那么其仅限定在该子句中明确列出的要素,其他子句中所记载的要素并不被排除在整体权利要求之外。
下面对本发明所提供的一种全自动分布式一致性的分析方法进行详细描述。本发明实施例中未作详细描述的内容属于本领域专业技术人员公知的现有技术。本发明实施例中未注明具体条件者,按照本领域常规条件或制造商建议的条件进行。
实施例一
本发明实施例提供一种全自动分布式一致性的分析方法,如图2所示,该方法主要包括如下步骤:
步骤1、读取应用程序的代码,使用程序分析技术,将代码中每一会影响应用程序状态的代码路径编码为中间表达语言。
本发明实施例中,通过程序分析技术从应用程序的代码中提取出模型和关系,以及对应用程序状态有影响的代码路径的路径条件、对应用程序状态的影响和外部参数;其中,模型在代码对应的关系型数据库中以表的形式存在,关系是指模型之间的关系。编码为一致性语义的中间表达语言(简称为中间表达语言)时,对于每一会影响应用程序状态的代码路径,结合程序分析获得的模型和关系以及外部参数,将路径条件与对应用程序状态的影响中包含的表达式编码为中间表达语言中的表达式,并结合对应用程序状态的影响中的命令,以及对应用程序状态的影响对应的中间表达语言中的表达式生成中间表达语言中的命令。
本发明实施例中,可以将所述程序分析技术与隐式树遍历技术相结合,并采取与网络服务开发框架联合工作的分析方式;具体的:将使用程序分析技术实现的分析工具添加至编写应用程序代码的网络服务开发框架中;通过分析工具从代码中提取出模型和关系,以及应用程序的路由信息,根据路由信息调用视图函数并执行;在视图函数执行过程中遍历所有代码路径,收集外部参数,基于隐式树遍历技术并结合提取出的模型和关系记录代码路径对应的路径条件和代码路径对应用程序状态的影响;确定会影响应用程序状态的所有代码路径,保留对应的外部参数、路径条件和对应用程序状态的影响。简单来说,以上过程中对于每一个代码路径都可以得到对应的路径条件、对应用程序状态的影响与外部参数,如果某个代码路径会影响应用程序状态,则相应代码路径对应的路径条件、对应用程序状态的影响与外部参数都需要筛选出来,并编码为中间表达语言。此处所涉及的外部参数是指由外部输入至应用程序的参数,可以是用户输入的参数,以银行账户管理系统为例,外部参数可以是用户输入的取钱数目。
本发明实施例中,每一会影响应用程序状态的代码路径对应若干中间表达语言中的命令,每一命令包含若干中间表达语言中的表达式(对应对应用程序状态的影响);当然,每一会影响应用程序状态的代码路径还包含路径条件对应的若干中间表达语言中的表达式。所述中间表达语言中的表达式包括:字面量表达式和非字面量表达式;其中,字面量表达式仅包含数据,非字面量表达式包含数据以及相关运算、操作或查询原语。
本发明实施例中,中间表达语言中的表达式中数据的类型包括:简单数据类型和复杂数据类型,所述简单数据类型包括:整数、实数、字符串、布尔值、日期时间与对象引用;所述复杂数据类型包括:对象和查询集;所述对象是数据实体,通过模型对对象进行分类,模型对应于关系型数据库系统中的表,每个持久化对象都属于一个模型,所述查询集为模型的查询集,所述对象引用为模型对象的引用;所述关系是指不同模型之间的关系。
本发明实施例中,所述中间表达语言是非是图灵完备的,包含关系型数据查询和操作原语,省去了包含用户定义函数、用户定义数据类型、不受限的循环与不受限的递归的编程语言构造。
步骤2、将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为定理证明器能够识别的形式,再输入至所述定理证明器,通过所述定理证明器检查每一对会影响应用程序状态的代码路径是否能够并发执行,枚举完所有会影响应用程序状态的代码路径后,获得应用程序的弱分布式一致性分析结果。
本发明实施例中,可以选择SMT(可满足性模理论)求解器作为定理证明器,依次对每一条会影响应用程序状态的代码路径的中间表达语言进行SMT编码,翻译为SMT求解器能够识别的形式。由于本发明主要针对会影响应用程序状态的代码路径,因此,会影响应用程序状态的代码路径可以简称为代码路径。SMT编码时对代码路径分别进行SMT编码,从而将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为SMT求解器能够识别的形式。
从SMT求解器定义的符号S(即设定的应用程序状态S)开始分别对每一代码路径进行SMT编码,每一代码路径的SMT编码方法相同;对于单个代码路径,对代码路径中的所有中间表达语言的命令以及路径条件对应的若干中间表达语言中的表达式分别进行SMT编码,对所有中间表达语言的命令进行SMT编码后,获得代码路径对应的应用程序状态以及额外的路径条件,对路径条件对应的若干中间表达语言中的表达式进行SMT编码后,获得SMT编码的路径条件,代码路径的最终路径条件为额外的路径条件与SMT编码的路径条件的合取(即逻辑与运算);最终,获得每一代码路径对应的应用程序状态与最终路径条件,完成所有会影响应用程序状态的代码路径的SMT编码。
本发明实施例中,所述通过所述定理证明器检查每一对代码路径是否能够并发执行包括:结合每一代码路径对应的应用程序状态与最终路径条件,对每一对代码路径进行可交换性规则与语义规则进行检查,判断是否能够并发执行;此处的每一对可以前文筛选出的所有会影响应用程序状态的代码路径任意组合。
可交换性规则为:代码路径A和代码路径B对应用程序状态的影响与代码路径A和代码路径B的执行顺序无关,表示为:
其中,S代表设定的应用程序状态,为任意符号,点号为分隔符号,表示在设定的应用程序状态上执行会影响应用程序状态的代码路径A后的应用程序状态,即对会影响应用程序状态的代码路径A进行SMT编码得到的应用程序状态,表示在应用程序状态上执行会影响应用程序状态的代码路径B后的应用程序状态(也就是在应用程序状态上对代码路径B进行SMT编码);表示在设定的应用程序状态上执行会影响应用程序状态的代码路径B后的应用程序状态,即对会影响应用程序状态的代码路径B进行SMT编码得到的应用程序状态,表示在应用程序状态上执行会影响应用程序状态的代码路径A后的应用程序状态(也就是在应用程序状态上对代码路径A进行SMT编码)。
语义规则为:代码路径A先执行后,不会导致代码路径B的路径条件失效,反之亦然,可表示为:
其中,符号表示实质蕴含(表示如果A那么B),符号表示逻辑与(表示A成立并且B成立),表示在设定的应用程序状态S上会影响应用程序状态的代码路径A的最终路径条件求值结果为真;表示在应用程序状态上会影响应用程序状态的代码路径A的最终路径条件求值结果为真,表示在设定的应用程序状态S上会影响应用程序状态的代码路径B的最终路径条件求值结果为真;表示在应用程序状态上会影响应用程序状态的代码路径B的最终路径条件求值结果为真。
如果一对代码路径通过两项规则检测,表示它们之间不存在限制,因此,可以并发执行。
为了更加清晰地展现出本发明所提供的技术方案及所产生的技术效果,下面以具体实施例对本发明实施例所提供的方法进行详细描述。
一、程序分析与中间表达语言形式的生成。
本发明实施例中,在实际的分布式一致性分析前,首先由程序分析组件将应用程序的代码转换为中间表达语言形式,具体是将每一条可能影响应用程序状态的代码路径都将一一转换为相应的中间表达语言的形式,用于后续的分布式一致性分析。下面先针对中间表达语言进行介绍,再以示例的方式介绍相关的程序分析过程。
1、中间表达语言。
本发明实施例中,中间表达语言是一种具有简单类型的命令式语言,其数据类型包括简单数据类型和复杂数据类型,简单数据类型包括整数、实数、字符串、布尔值、日期时间与对象引用关系等,其中,对象引用多数情况下与整数没有区别;复杂数据类型包括对象和查询集。
作为一种命令式语言,中间表达语言区分了表达式和命令两种语法范畴。下面所述的表达式与命令均是指中间表达语言中的表达式与命令。表达式由这些数据类型上定义的运算和操作以及数据查询原语构成,如数学运算、数据类型转换、根据关系查找与某对象关联的另一个对象等,或者直接由数据构成。表达式只读取应用程序状态,不作任何修改。相对地,命令专门用于修改应用程序状态,如删除某些对象、修改某个对象在应用程序状态中存储的数据;命令中包含有若干表达式,通过表达式读取应用程序状态再进行修改。中间表达语言有意保持简单和图灵不完备,以利于后续的自动化程序验证,但同时引入足够多的特性,以便于自动化程序分析。
本发明实施例中,对象是储存在数据库中的数据实体,如一个用户对象可能包含用户名、密码、出生日期等信息,在关系型数据库中以行的形式存在。模型是对对象的分类,一个用户对象的模型就是用户,在关系型数据库中以表的形式存在。用户对象间可以被用户模型上定义的关系关联起来,如一个用户可能关注另外许多用户,反过来说,一个用户可以被许多其他用户关注,因此关注关系是定义在用户模型上的多对多关系。查询集是对象的有序集合,数据库查询的结果是一个查询集,后文提及的μ obj是指一个模型μ的单个对象(即属于模型μ这一类别的单个对象),μ set是指一个模型μ的查询集,即模型μ的对象集合(即属于模型μ这一类别的对象组成的集合)。关系在语言中没有具体的表现形式,一般通过部分命令(如 Link、DeLink)修改,这些命令使用关系的名称。
本发明实施例中,关系定义在两个模型上,其中一个模型称为来源模型,另一个称为目标模型。两个对象对应的模型分别是来源模型和目标模型,这两个对象可以被这两个模型间的某个关系(如之前提供的关注关系)关联起来,模型间的关系的作用是关联两个模型中的对象,例如,来源模型中的对象可以查询到与之关联的若干目标模型中的对象,并且目标模型中的对象也可以反向查询到与之关联的若干来源模型中的对象。关系可以是以下三种形态之一:(1)一对一,一个来源模型中的对象最多与一个目标模型中的对象关联;(2)多对一,一个目标模型中的对象可以关联多个来源模型中的对象;(3)多对多,一个来源模型中的对象可以关联多个目标模型中的对象,同时一个目标模型中的对象也可以关联多个来源模型中的对象。关系可以拼接和转置。A1(来源模型)到A2(目标模型)的关系和A2到A3的关系可以连接起来,形成A1到A3的新关系。A1到A2的关系可以转置,形成A2到A1的新关系;此处的A1~A3是指三个不同的模型。
下面以示例的形式提供中间表达语言的类型系统语法、表达式的语法、表达式中关系型查询语言的语法、以及命令的语法,具体如表1~表4所示。
表1:中间表达语言的类型系统语法
其中,上标 + 表示相应部分可重复出现1次或多次,上标 * 表示相应部分可重复出现 0 次或多次,符号::=表示定义,符号|表示或。
表2:各数据类型上定义的典型的运算表达式,及相关语法
表3:表达式为持久化数据引入的典型的关系型查询,查询语言为代数化
表4:中间表达语言表达包含的命令(用于更新应用程序状态)
如表4所示,命令中的e即为前文所述的表达式,中间表达语言的形式中没有定义创建对象的原语,这是因为中间表达语言形式要求每个构造好的对象都必须含有ID域,而新对象并没有ID。并且,在分布式系统中,新ID往往在整个系统中是唯一的。为此,代码分析时将新创建的ID作为当前路径的一个额外参数,这个ID将被赋予对应的额外公理,而创建对象操作本身被视作用新信息更新这个ID所指向的对象;本发明实施例中所有的ID均是指对象ID,它是每个对象的唯一标识。
上述表1~表4以本领域普通技术人员可以识别的形式列出了实施例的语法形式,除了已经另作解说的部分,其余语法形式的语义与常规程序设计语言和关系型数据库同类语法形式的语义相同。例如,concat(“str”, “ing”) 表达式的求值为字符串 “string”,(1+2)<3 的求值为 false,isprefix(“pre”, “prefix”) 求值为 true。对于本领域的普通技术人员来讲,参考表格最后一列的说明,在不付出创造性劳动的前提下,可以获得具体的求值规则和类型检查规则,并可以根据通用的领域知识,推导出各语法形式之间的代数关系。
本发明实施例中,中间表达语言的特征是缺少一些常见的编程语言构造,包括但不限于用户定义函数、用户定义数据类型、不受限的循环、不受限的递归。这使得中间表达语言并非是图灵完备的,从而也不是完整的通用编程语言。事实上,这些构造均为故意省却的,从而便于后续的自动化一致性分析。根据可计算性理论的莱斯定理可知,任何图灵机的非平凡性质都是不可判定的。通过消除这类会导致图灵完备的语言构造,可以提高后续定理证明的有效性。本领域技术人员可以清楚地了解到,程序语言的图灵完备性是容易做到的,相反,要使得有实用价值的语言图灵不完备则需要特殊的设计努力。
还需要说明的是,前文提供的各类中间表达语言中的符号形式均为举例,并非构成限制;本领域技术人员可以根据实际情况或者经验调整符号形式。
2、程序分析。
本发明实施例中,使用动态符号执行技术和隐式树遍历技术将代码转换为中间表达语言形式。示例性的,代码可以为Python代码或Java代码,也可以为其他语言编写的代码,其中,Python 是一种动态类型语言,常用于网络服务开发。Django 是一种常见的网络服务开发框架。动态符号执行技术是一种动态程序分析技术。该技术增强程序设计语言的运行时环境,使得变量的抽象状态不仅可以是具体值,也可以是一个符号值。隐式树遍历技术是一种算法,用于遍历潜在的树结构,本发明实施例中用于在不提前进行静态程序分析的前提下动态提取所有代码路径。
下面以Python代码与Django框架为例,实现Python 的动态符号执行技术,并提供可应用于 Django 和 Django-RestFramework的分析工具和代码补丁,用于将 Django 的QuerySet(查询集)和模型转换为符号值,以便于转换为上文描述的中间表达代码。Django是一种用于Python语言的流行的Web开发框架,Django-RestFramework 在 Django 的基础上简化了一种流行的 Web API(应用程序编程接口) 风格(RESTful API,表现层状态转化应用程序编程接口)的开发。用户在使用分析工具前,需将分析工具作为一个额外的开发模块添加到使用 Django 开发的 Web 项目中。作为分析的第一步,分析工具首先载入并分析整个应用程序的所有模型和关系,这部分存储为全局静态信息,用于后续的分析。作为分析的第二步,分析工具载入并分析整个应用程序中所有的 URL(统一资源定位符)路由信息。在 Django 中,每个 HTTP (超文本传输协议)端点对应于一个可调用对象(如函数或类成员方法,简称视图函数),得到URL路由信息即可得到这些视图函数。然后分析工具构造符号请求,将符号请求作为函数参数传入并调用这些视图函数。作为分析的第三步,每个视图函数在执行中,如果试图取一个用户传入的参数(即外部参数),这些外部参数将自动被记录为额外的参数并作为符号值提供给原应用程序;如果符号值参与了程序分支(如 if 分支、while 循环等),程序分支即为代码路径,分析程序中的控制流分析模块将与符号执行模块协同,依据隐式树遍历技术,记录当前程序分支状态并进一步执行,直到视图函数返回,随后重启该视图函数,使得所有代码路径恰好不重不漏地被执行一遍;其中,控制流分析使用与控制流相关的语句(例如,隐式树遍历技术处理代码中的 if, while, for 等),将一个树状的代码分析成多个直线形的代码路径;符号执行模块用于分析单独的代码路径,提取所需的信息(路径条件、副作用、外部参数),并最终产生中间表达输出。在执行过程中,包含代码补丁的 Django 会在修改应用程序状态时通知分析工具记录相应的事件,依照第一步中获取到的全局静态信息,追踪并记录查询集、对象与关系上的操作,控制流分支的条件将被记录为路径条件,例如,一次分支(如 if)会影响两个路径的条件,一个对应于 if 条件为真,一个对应于 if 条件为假。符号值上的操作如果对应用程序状态有影响,会被收集到这条路径的副作用集合中(副作用指对应用程序状态的影响)。最后,每条代码路径会依据其 URL 路由的名称和路径的编号被赋予一个唯一的路径名称,用于验证后结果的输出。
本发明实施例中,程序分析结束后,可以收集到应用程序的以下信息:(1)模型,(2)关系,(3)所有视图函数及其对应的 URL 路由信息,(4)每个视图函数所有有可能影响应用程序状态的代码路径,(5)每个代码路径的名称、外部参数、执行完毕代码路径所对应的充分条件(简称路径条件)、最终对应用程序状态的影响(简称副作用)。根据是否对应用程序状态有影响(副作用是否为空),筛选出对应用程序状态造成影响的代码路径,获得对应的路径条件、副作用与外部参数;结合模型、关系与外部参数,将路径条件与副作用编码为中间表达语言形式,也就是编码为路径条件对应的中间表达语言中的表达式,副作用对应的中间表达语言中的命令。
本发明实施例中,收集到的副作用与路径条件均是符号值,需要翻译为中间表达语言形式才能进行后续验证,可以根据实际需要选择合适的翻译方法。在上述 Python 分析过程中,要把符号值的表达式转换为中间表达语言形式,一种可能的实现方法是,符号值记录自身发生过的运算,例如符号值 a 和 b 的加法运算 a+b 以类似 [+, a, b] 的格式记录,在路径分析完成后再统一转换为中间表达语言;另一种可能的实现方法是将中间表达语言的抽象语法树维护在符号值内,路径分析过程中,符号值上发生运算时,立即构造相应的中间表达语言形式,于是在路径分析完成后,直接读取符号值内记录的中间表达语言结果即可,无需另行转换。例如,设若 obj 是符号对象,令 obj.IR 存储中间表达语言编码obj 的结果,那么在遇到语句 obj.field = value(将值 value 赋予对象 obj 的 field域)时,依据 obj 所属何种模型,生成对应的 setfield 表达式并更新到 obj.IR 中;在遇到表达式 obj.related 时(查询与 obj 关于某个关系关联的另一个或几个对象),依据related 键查询程序分析收集到的关系,找到与 related 关联的关系ρ,生成相应的follow 表达式(follow 的第一个参数是关系ρ,而非域的名称,如此处的 “related”), 将该 follow 表达式记录为 obj.related 求值结果的中间语言表达形式。第二种方法较第一种方法更为简便。中间表达语言在设计时主要考虑第二种分析方法,所有值都是不可变(immutable)且引用透明(referential transparency)的,使得中间语言的抽象语法树更容易被集成到符号值中,简化了分析程序的实现。
本领域的技术人员可以理解,上述 Python 代码的分析过程仅为一具体实施例,潜在地还可以利用其他分析策略实现其他语言的分析工具。只要分析工具可以输出一致性语义的中间表达语言,那么整个分析流程都是有效的。
二、分布式一致性分析。
本发明实施例中,在得到中间表达语言的程序语义后,可以进行一致性分析。一致性分析基于PoR一致性理论实现,该PoR一致性理论是一种参数化的一致性理论,在PoR一致性理论中,应用程序的一致性被建模为代码路径(即两个操作之间)之间的限制关系。如果一对代码路径之间被施加限制,一个 PoR一致的部署应该保证对于整个应用程序这对代码路径是不会并发执行的,即被限制的一方代码路径必须可以看到另一方代码路径的执行结果才能继续执行。基于 PoR 一致性模型的检查规则,自动对每一对代码路径进行一致性检查,最终输出原应用程序的 PoR 一致性需求,即原始应用所对应的限制集。
本发明实施例中,SMT 求解器用于实现PoR一致性理论。
本发明实施例中,使用精心设计的编码方式将中间表达语言翻译为 SMT 求解器可以识别的形式,然后调用 SMT 求解器自动检查可交换性规则和语义规则,如果两个规则均检查通过,则这一对代码路径之间不存在限制,否则这对代码路径会被添加到最终的限制集结果中。
本发明实施例中,SMT 编码从代码路径开始,每一代码路径都从设定的应用程序状态S的基础上进行SMT 编码,每一代码路径中有对应用程序状态的影响对应的若干中间表达语言中的命令,以及路径条件对应的若干中间表达语言中的表达式;每一中间表达语言中的命令包含若干中间表达语言中的表达式;对于每一中间表达语言中的命令,依次对其包含的每一表达式进行SMT编码,根据表达式的具体内容涉及到模型的查询集、模型的对象引用、模型的对象、简单数据类型的SMT编码;所有表达式都完成SMT编码后,执行相应的命令,得到新的应用程序状态以及新的路径条件集合,称为执行结果,后一命令都从上一命令的执行结果的基础上开始;所有命令执行结果中的新的路径条件集合的并集构成了代码路径的额外路径条件,最后一个命令的执行结果中的应用程序状态即为代码路径对应的应用程序状态,应用程序状态是模型状态和关系状态的组合,是SMT求解器可识别的形式,模型状态和关系状态的产生利用到所述查询集的编码和关系状态的编码。同样的,路径条件对应的若干中间表达语言中的表达式也需要进行SMT编码,得到SMT编码的路径条件,代码路径的最终路径条件为额外的路径条件与SMT编码的路径条件的合取。完成所有代码路径的SMT编码后可以进行可交换性规则和语义规则的检查。
1、SMT编码方式。
本发明实施例中,为了有效地利用 SMT 求解器的自动推理能力,精心设计了中间表达语言的 SMT 编码。事实上,中间表达语言可以有多种 SMT 编码形式,但某些显而易见的编码形式非常低效,无法实用。例如,将应用程序状态编码为若干 SMT 列表就是一种低效的编码。下面描述一种较为高效的编码形式。
如之前所述,中间表达语言中的表达式的SMT编码涉及模型的查询集、模型的对象引用、模型的对象、简单数据类型的SMT编码;此处部分不区分路径条件与对应用程序状态的影响对应的中间表达语言中的表达式。
下面使用符号[.]表示SMT 编码。设若μ是一个模型,则[μ ref]代表模型μ的对象引用(模型主键类型)的 SMT 编码,可以是 SMT 求解器中的整数类型;[μ obj]代表模型μ的对象的 SMT 编码,可以是 SMT 求解器中的一个元组;此部分信息的SMT编码方式可参考常规技术,例如,一个定义了用户名和密码域的模型,其对应的对象可以使用 Tuple[String, String] 类型(具有两个字符串元素的元组)表示。
本发明实施例中,编码的核心技术是将模型μ的查询集(μ set)编码为 SMT元组类型,表示为[μ set];[μ set] 含有如下成员:
1)ids:ID 集合,类型是Set<[μ ref]>。该ID集合定义了该模型μ的查询集中含有的所有对象ID;其中 Set类型是 SMT 求解器提供的集合类型,代表[μ ref]类型值的集合。
2)data:从μ ref 到μ obj 的映射,类型是 Array<[μ ref], [μ obj]>。该映射定义了有效 ID所对应的对象所具有的实际数据;其中, Array是 SMT 求解器提供的关联数组类型,代表从[μ ref]到[μ obj]的映射。
3)order:从μ ref 到 int 的映射,类型是 Array<[μ ref], int>。对于任意对象ID对应的id值,order[id] 是一个没有附加解释的整数,表示id值所代表对象的order,不同对象拥有不同的 order 值。该映射定义了模型μ的查询集中对象之间的相对顺序。例如,设模型μ的查询集K中有两个对象 obj1 和 obj2,它们ID对应的id值分别是id1和id2,并且K.order[id1] < K.order[id2],则 obj1 在该模型μ的查询集中排序在 obj2 之前。相应地,若 K.order[id1] > K.order[id2],则 obj1 排序在 obj2 之后。若 K.order[id1] =K.order[id2],则 obj1 和 obj2 是同一对象;K.order[id1]、K.order[id2]分别是指模型μ的查询集K中id1、id2所代表对象(即obj1、obj2)的order。
其中,K.ids、K.data 和 K.order 分别指代模型μ的查询集 K 编码的三个成员。下文同。
应用程序的状态为所有模型状态和所有关系状态的组合。模型μ的状态表示为一个μ set 值 all(μ),但额外需满足如下公理约束:
该公理要求 all(μ) 中存储的对象均满足如下性质:如果凭借r从all(μ)中取得了对象obj,那么obj的ID对应的id值一定也等于r。
如果一个μ set值是从all(μ)中派生出来的,则称它是有效的模型状态。
每个关系关联着两个模型,分别称作 from(来源)模型和 to(目标)模型。每个关系的状态分为 backward (后向)和 forward (前向)两部分,编码如表5所示。
表5:关系状态编码
表5中,Set类型是 SMT 求解器提供的集合类型,将尖括号中的内容记为T’;Array是 SMT 求解器提供的关联数组类型,尖括号中的第一项为键类型T’’,第二项为值类型为V’;Optional的值可能是空、也可能是某个T’类型的值,T’= FromRef , ToRef,V’=Optional, Set;FromRef 表示 from 模型的对象引用,表示为[from ref],ToRef 表示 to模型的对象引用,表示为[to ref];如果对象 obj1 被某个关系(正向)关联到 obj2 上,那么 obj2 也被这个关系反向关联到 obj1 上。例如,对于一对一关系 R,若有 Rforward[obj1.ID] = obj2.ID,则 Rbackward[obj2.ID] = obj1.ID;其中,Rforward、Rbackward分别表示一对一关系中的正向关联、反向关联; obj1.ID、obj2.ID是表示这两个对象的ID,结合前文提供的表达形式,这两个对象对应的id值可以对应的表示为id1、id2。
关系状态中的 forward 和 backward 部分必须是关联起来的,两者间不能没有关系,否则SMT求解器可能会生成错误的状态,导致验证错误。因此,有效的关系状态必须满足一定的公理约束。下面用字母 r 代表对象ID对应的id值,用 f 代表关系的 forward 部分(f[r] 表示与 r 正向关联的对象的 ID,如果没有关联则是空),数字1和2为标识,b 代表关系的 backward 部分(b[r] 代表与 r 反向关联的对象的 ID),valid(r) 表示应用程序状态中存在某个对象,它的id值是 r,即r 是有效的id值。
有效的一对一关系状态需满足如下公理约束:
有效的多对一关系状态需满足如下公理约束:
有效的多对多关系状态需满足如下公理约束:
其中, 表示当且仅当,表示逻辑与。三类公理约束的第一行表达关系只关联存在的对象,不会关联两个不存在的对象;第二行表达如果 obj1 正向关联到 obj2 上,那么 obj2 也反向关联到 obj1 上。
使用上述的SMT编码方式,可以高效地在 SMT 求解器中翻译中间表达语言所定义的集合操作原语。例如:orderby可以通过仅修改 order 成员实现,并且若不涉及orderby,order 成员可以被 SMT 求解器忽略掉,从而极大地减少复杂而低频的功能对简单而高频的功能的干扰。
除上述复杂数据类型外,简单数据类型及其上的操作可以直接对应于SMT求解器提供的类型及其操作,可通过常规技术实现;下面提供若干简单示例:中间表达语言的字符串类型可以对应于SMT求解器提供的序列类型,中间表达语言的字符串拼接操作可直接编码为SMT求解器提供的序列拼接操作。
下面具体描述如何从中间表达语言得到 SMT 求解器可识别的形式,这个过程简称为SMT 编码。
SMT 编码从代码路径开始,代码路径中包含若干个命令,每个命令又包含若干表达式,n表示命令的总数。对代码路径的SMT编码,总是从一个SMT求解器定义的符号S(可以理解为一个设定的应用程序状态)和空白的路径条件集合开始,然后在这个SMT求解器定义的符号S上执行后会产生一个新应用程序状态和一个新的路径条件集合,再从新的应用程序状态和路径条件集合开始执行第二个命令,以此类推;直到执行完最后一个命令后,得到的最终状态就是这个代码路径从SMT求解器定义的符号S出发执行完毕后的最终的应用程序状态(也即前文提到的路径代码进行SMT编码后对应的应用程序状态),得到的路径条件集合是代码路径可以从头执行到尾的充分条件(也即前文提到的额外路径条件);当然,路径条件对应的若干中间表达语言中的表达式也需要进行SMT编码;至此完成了一条代码路径的SMT 编码;其中,SMT 编码也就是代码路径、命令、表达式逐层深入的编码过程,此部分涉及到各个表达式的编码,而表达式涉及到的所有元素都需要编码为SMT可识别的形式,即表达式涉及到的查询集、模型的对象引用、模型的对象、简单数据类型等都需要进行SMT编码,具体方案可参见前文的介绍。
如之前所述,应用程序的状态由所有模型的状态和所有关系的状态组成。模型状态是 SMT 求解器中的μ set 值 all(μ),产生一个初始模型状态将使用到前述[μ ref],[μobj]和[μ set],也可能涉及的简单数据类型的编码;产生一个初始关系状态的过程利用前述一对一、一对多、多对多关系状态的编码,将使用到前述的[μ ref]。
以执行第一个命令为例,介绍相应的流程:
1)对中包含的所有表达式进行SMT编码;表达式编码过程中可能涉及对SMT求解器定义的符号S中存储的模型状态和关系状态的读取;表达式编码过程中,简单数据类型运算的编码利用前述简单数据类型的编码,查询集相关运算利用前述查询集和模型对象的编码,对象上的操作涉及查询集、模型对象和模型引用的编码。
2)依据命令本身所定义的应用程序状态修改方式,将所有表达式的SMT编码所表达的信息整合到S或中,得到,此部分可使用常规技术实现每条命令所定义的整合过程;对命令的编码过程涉及到对模型状态和关系状态的修改,利用到前述对查询集和关系状态的编码。
对照前述表4提供的各类命令,下面对照的给出各命令对应的SMT编码方案。
表6:命令的 SMT 编码
如之前所述,对命令进行SMT编码的过程中需要对命令中的表达式进行SMT编码。表达式的SMT编码方法如下:参照表 2 和表 3,中间语言中表达式可以分为字面量表达式和非字面量表达式,字面量表达式为表2中定义的字面量,非字面量表达式为表2和表3中定义的非字面量的其他类型表达式。字面量可以参照对应类型直接产生 SMT 求解器可以识别的形式,例如,简单数据类型中的整数 1 可以直接转换为 SMT 求解器中的 1。非字面量表达式,包含查询集等复杂数据类型,形式为,其中op代表表 2 和表 3 中列出的表达式算子。要编码,首先,编码,然后依据op的语义产生最终结果(后文示例三 是一个 filter 编码的例子)。用[.]代表中间表达语言的 SMT 编码,则上述过程可以写作。编码过程中,会利用到前述各类型的编码,例如 all(μ) 的编码的类型是 [μ set](前述查询集的编码),而 any(all(μ))(任意一个模型 µ 中的对象)的编码的类型为 [μ obj](SMT 求解器中的元组)。编码过程中,会使用当前的应用程序状态和程序分析时收集到的静态信息,例如 all(μ) 会查询当前应用程序状态中保存的模型μ的状态,filter 的一些用法(下述示例三)可能会涉及到对关系状态的访问。
2、检查规则。
本发明实施例中,使用可用于 PoR 一致性理论的两条自动化检查规则,描述如下。
1)可交换性规则:代码路径A和代码路径B整体的副作用(即两个代码路径整体上对应用程序状态的影响)与代码路径A 和代码路径B 的执行顺序无关,表示为:
其中,S代表设定的应用程序状态,为任意符号,表示在设定的应用程序状态上执行会影响应用程序状态的代码路径A后的应用程序状态,即对会影响应用程序状态的代码路径A进行SMT编码得到的应用程序状态,表示在应用程序状态上执行会影响应用程序状态的代码路径B后的应用程序状态(也就是在应用程序状态上对代码路径B进行SMT编码);表示在设定的应用程序状态上执行会影响应用程序状态的代码路径B后的应用程序状态,即对会影响应用程序状态的代码路径B进行SMT编码得到的应用程序状态,表示在应用程序状态上执行会影响应用程序状态的代码路径A后的应用程序状态(也就是在应用程序状态上对代码路径A进行SMT编码)。
2)语义规则:代码路径A先执行后,不会导致代码路径B的路径条件失效,反之亦然,可表示为:
其中,符号表示实质蕴含(表示如果A那么B),符号表示逻辑与(表示A成立并且B成立),表示在设定的应用程序状态S上会影响应用程序状态的代码路径A的最终路径条件求值结果为真;表示在应用程序状态上会影响应用程序状态的代码路径A的最终路径条件求值结果为真,表示在设定的应用程序状态S上会影响应用程序状态的代码路径B的最终路径条件求值结果为真;表示在应用程序状态上会影响应用程序状态的代码路径B的最终路径条件求值结果为真。
以上为本发明实施例提供的全自动分布式一致性的分析方法,以上方案通过引入优化设计、并且可编码一致性语义的中间表达语言,将程序分析与一致性分析(弱一致性分析)解耦,从而大幅提高了分析的效率,使得分析现存的大中型网络应用程序成为可能,并且可以容许在程序分析中自由增加或混合不同的分析策略来处理不同的程序设计语言和高级开发框架,降低支持新语言或框架的技术成本;一致性分析时也可以根据具体输入自由选取不同的验证策略,提高分析效率;同时,通过本发明提供的方案使得多语言混合系统的分析成为可能。
下面给出若干中间表达语言构造的编码形式作为示例,但为了描述的方便和简洁,没有给出所有操作的编码。本领域的技术人员可以参考这些示例在不付出创造性劳动的前提下补全所有操作的具体编码形式。
示例一。
两个模型的查询集K1和K2求交集的编码:
假设K1和K2均是有效模型状态,即若两个对象的id值相同,那么它们的数据也是一致的,则K1和K2的交集K'满足 K'.ids = K1.ids ∩ K2.ids,而 K'.data 和 K'.order 与K或 K中任意一者一致,K'.ids 、K'.data 和 K'.order表示交集K'为SMT元组类型的三个成员;K1.ids、K2.ids分别表示模型的查询集K1和K2对应SMT元组类型的ID集合。
示例二。
两个模型的查询集K1和K2合并的编码:
K1和K2的并集 K'' 满足 K''.ids = K1.ids ∩ K2.ids;对 K''.data 来说,如果对象的id值r 属于 K1.ids,则 K''.data[r] = K1.data[r](并集 K'' 中 id 值为 r 的对象的数据取自模型的查询集K1),否则 K''.data[r] = K2.data[r] (并集 K'' 中 id 值为r 的对象的数据取自模型的查询集K2);对 K''.order 来说,如果对象的id值r属于K1.ids,则 K''.order[r] = K1.order[r] (并集 K'' 中 id 值为 r 的对象的顺序取自模型的查询集K1),否则 K''.order[r] = K2.order[r] + max{ K1.order}(并集 K'' 中 id 值为 r的对象的数据取自模型的查询集K2,并且排在所有 K1元素之后);其中,K''.ids、K''.data和K''.order表示交集K''(为SMT元组类型)的三个成员,K1.ids、K2.ids分别表示模型的查询集K1和K2对应SMT元组类型的ID集合。
示例三。
符号表示投射器,x 为任意合理值,K'''为任意查询集,则 filter()的编码为:
(1)设,其中代表任意域。此时原 filter 形式为 filter(),代表K'''中所有域的值等于x的对象。编码 filter(的结果是一个查询集Q, Q.ids (即查询集Q的ID集合,它是SMT编码集合类型的一种)的所有id值 r 满足如下约束:
其中,上面式子中各表达式语句的含义在之前的表3中有相关解释,K '''.data[r]代表查询集K '''对应SMT元组类型data中id值为r的对象的数据。
查询集Q 对应SMT编码元组的其他成员(data、order)与 K'''相同,具体SMT编码方式之前已做了详细介绍,故不再赘述。
(2)设。此时原filter 形式为 filter(),意为首先取出与 K''' 中元素关于关系ρ(正向)关联的所有对象,然后在这些对象中,取出域Φ的值等于x的所有对象。假设关系ρ关联着μ1和μ2两个模型。该 filter 式的编码是一个新μset (新查询集)Q',Q'通过如下过程产生:
a)首先取应用程序状态中存储的模型μ2的状态;
b)利用与情形(1)类似的方法限制模型μ2的状态中元素的域Φ均等于x,得到查询集 Y;
c)将 Y 沿着ρ反向投射为查询集 Z,其类型是μset;
d)将查询集Z 与K'''相交,得到新查询集Q'。
的情形完全同理。
(3)设。此时原 filter 形式为 filter(),意为首先取出与K'''中元素关于关系(正向)关联的所有对象,然后在这些对象中,取出域Φ的值等于x的所有对象。假设关系ρ1与ρ2先后关联着μ1、μ2、μ3三个模型。该 filter 式的编码是一个新μset(新查询集) Q'',Q''通过如下过程产生:
a)首先取应用程序状态中存储的模型μ3的状态;
b)利用与情形(1)类似的方法限制模型μ3的状态中元素的域Φ均等于x,得到查询集Y';
c)将查询集Y' 沿着ρ2反向投射为查询集 Z',其类型是μset;
d)将查询集 Z' 沿着ρ1反向投射为查询集 W,其类型是μset;
e)将查询集 W 与K'''相交,得到新查询集Q''。
(4)更多的关系嵌套情形可以通过推广情形(3)的方法实现。
示例四。
update(H) 的编码:
设 H 是μ set (模型μ的查询集)类型,将H合并到当前的模型μ的状态 all(μ) 中即可。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例可以通过软件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,上述实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
实施例二
本发明还提供一种全自动分布式一致性的分析系统,其主要基于前述实施例提供的方法实现,如图3所示,该系统主要包括:
程序分析组件,用于读取应用程序的代码,使用程序分析技术,将代码中每一会影响应用程序状态的代码路径分别编码为中间表达语言;
一致性分析组件,用于将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为定理证明器能够识别的形式,再输入至所述定理证明器,通过所述定理证明器检查每一对会影响应用程序状态的代码路径是否能够并发执行,枚举完所有会影响应用程序状态的代码路径后,获得应用程序的弱分布式一致性分析结果。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将系统的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
实施例三
本发明还提供一种处理设备,如图4所示,其主要包括:一个或多个处理器;存储器,用于存储一个或多个程序;其中,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现前述实施例提供的方法。
进一步的,所述处理设备还包括至少一个输入设备与至少一个输出设备;在所述处理设备中,处理器、存储器、输入设备、输出设备之间通过总线连接。
本发明实施例中,所述存储器、输入设备与输出设备的具体类型不做限定;例如:
输入设备可以为触摸屏、图像采集设备、物理按键或者鼠标等;
输出设备可以为显示终端;
存储器可以为随机存取存储器(Random Access Memory,RAM),也可为非不稳定的存储器(non-volatile memory),例如磁盘存储器。
实施例四
本发明还提供一种可读存储介质,存储有计算机程序,当计算机程序被处理器执行时实现前述实施例提供的方法。
本发明实施例中可读存储介质作为计算机可读存储介质,可以设置于前述处理设备中,例如,作为处理设备中的存储器。此外,所述可读存储介质也可以是U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。

Claims (10)

1.一种全自动分布式一致性的分析方法,其特征在于,包括:
读取应用程序的代码,使用程序分析技术,将代码中每一会影响应用程序状态的代码路径分别编码为中间表达语言;
将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为定理证明器能够识别的形式,再输入至定理证明器,通过所述定理证明器检查每一对会影响应用程序状态的代码路径是否能够并发执行,枚举完所有会影响应用程序状态的代码路径后,获得应用程序的弱分布式一致性分析结果。
2.根据权利要求1所述的一种全自动分布式一致性的分析方法,其特征在于,所述使用程序分析技术,将代码中每一会影响应用程序状态的代码路径分别编码为中间表达语言包括:
通过程序分析技术从应用程序的代码中提取出模型和关系,以及对应用程序状态有影响的代码路径的路径条件、对应用程序状态的影响和外部参数;其中,模型在代码对应的关系型数据库中以表的形式存在,关系是指模型之间的关系;
对于每一对应用程序状态有影响的代码路径,结合程序分析获得的模型和关系以及外部参数,将路径条件与对应用程序状态的影响中包含的表达式编码为中间表达语言中的表达式,并结合对应用程序状态的影响中的命令,以及对应用程序状态的影响对应的中间表达语言中的表达式生成中间表达语言中的命令。
3.根据权利要求2所述的一种全自动分布式一致性的分析方法,其特征在于,所述通过程序分析技术从应用程序的代码中提取出模型和关系,以及对应用程序状态有影响的代码路径的路径条件、对应用程序状态的影响和外部参数包括:
将所述程序分析技术与隐式树遍历技术相结合,并采取与网络服务开发框架联合工作的分析方式,将使用程序分析技术实现的分析工具添加至编写应用程序代码的网络服务开发框架中;通过分析工具从应用程序的代码中提取出模型和关系,以及应用程序的路由信息,根据路由信息调用视图函数并执行;在视图函数执行过程中遍历所有代码路径,收集外部参数,基于隐式树遍历技术并结合提取出模型和关系记录代码路径对应的路径条件和代码路径对应用程序状态的影响;确定会影响应用程序状态的所有代码路径,保留对应的外部参数、路径条件和对应用程序状态的影响。
4.根据权利要求2所述的一种全自动分布式一致性的分析方法,其特征在于,所述中间表达语言中的表达式包括:字面量表达式和非字面量表达式;其中,字面量表达式仅包含数据,非字面量表达式包含数据以及相关运算、操作或查询原语;
数据的类型包括:简单数据类型和复杂数据类型,所述简单数据类型包括:整数、实数、字符串、布尔值、日期时间与对象引用;所述复杂数据类型包括:对象和查询集;所述对象是数据实体,通过模型对对象进行分类,所述查询集为模型的查询集,所述对象引用为模型对象的引用。
5.根据权利要求4所述的一种全自动分布式一致性的分析方法,其特征在于,所述将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为定理证明器能够识别的形式包括:
选择SMT求解器作为定理证明器,其中,SMT为可满足性模理论;对每一会影响应用程序状态的代码路径对应的中间表达语言分别进行SMT编码,翻译为SMT求解器能够识别的形式;
从设定的应用程序状态S开始分别对每一会影响应用程序状态的代码路径进行SMT编码,每一会影响应用程序状态的代码路径的SMT编码方法相同;对于单个会影响应用程序状态的代码路径,对所有中间表达语言的命令以及路径条件对应的若干中间表达语言中的表达式分别进行SMT编码,对所有中间表达语言的命令进行SMT编码后,获得单个会影响应用程序状态的代码路径对应的应用程序状态以及额外的路径条件,对路径条件对应的若干中间表达语言中的表达式进行SMT编码后,获得SMT编码的路径条件,单个会影响应用程序状态的代码路径的最终路径条件为额外的路径条件与SMT编码的路径条件的合取,所述合取是指逻辑与运算;最终,获得每一会影响应用程序状态的代码路径对应的应用程序状态与最终路径条件,完成所有会影响应用程序状态的代码路径的SMT编码。
6.根据权利要求5所述的一种全自动分布式一致性的分析方法,其特征在于,对中间表达语言的命令进行SMT编码时是分别针对命令包含的每一中间表达语言的表达式进行SMT编码,针对命令包含的中间表达语言的表达式以及路径条件对应的若干中间表达语言中的表达式进行SMT编码的方式相同;
中间表达语言中的表达式的SMT编码包括:模型的查询集、模型的对象引用、模型的对象与简单数据类型的SMT编码;其中,模型的查询集通过SMT编码为SMT元组类型,包括如下成员:ids、data与order,ids为ID 集合ID集合定义了模型的查询集中含有的所有对象ID;data为从μ ref 到μ obj 的映射,order为从μ ref 到 int 的映射,μ表示模型μ,μ ref表示模型μ的对象引用,μ obj表示模型μ的对象,int表示整数;
对于中间表达语言的命令而言,针对包含的所有中间表达语言的表达式进行SMT编码后,执行命令,即依据中间表达语言中的命令本身所定义的应用程序状态修改方式,将所有中间表达语言的表达式的SMT编码所表达的信息,得到单个中间表达语言中的命令SMT编码后的应用程序状态与新的路径条件,称为执行结果;按照单个会影响应用程序状态的代码路径的中间表达语言的命令的顺序,依次进行中间表达语言中的命令的SMT编码;中间表达语言中的后一命令都从上一命令的执行结果的基础上开始;中间表达语言中的所有命令执行结果中的新的路径条件的并集构成了单个会影响应用程序状态的代码路径的额外路径条件,中间表达语言的最后一个命令的执行结果中的应用程序状态即为单个会影响应用程序状态的代码路径对应的应用程序状态,应用程序状态是模型状态和关系状态的组合,且均为SMT求解器能够识别的形式。
7.根据权利要求5或6所述的一种全自动分布式一致性的分析方法,其特征在于,所述通过所述定理证明器检查每一对会影响应用程序状态的代码路径是否能够并发执行包括:
对每一对会影响应用程序状态的代码路径进行可交换性规则与语义规则进行检查,判断是否能够并发执行;若一对会影响应用程序状态的代码路径通过可交换性规则与语义规则进行检查,则表示能够并发执行;
可交换性规则为:会影响应用程序状态的代码路径A和会影响应用程序状态的代码路径B对应用程序状态的影响,与会影响应用程序状态的代码路径A和会影响应用程序状态的代码路径B的执行顺序无关,表示为:
其中,S代表设定的应用程序状态,为任意符号,点号为分隔符号,表示在设定的应用程序状态上执行会影响应用程序状态的代码路径A后的应用程序状态,即对会影响应用程序状态的代码路径A进行SMT编码得到的应用程序状态,表示在应用程序状态上执行会影响应用程序状态的代码路径B后的应用程序状态;表示在设定的应用程序状态上执行会影响应用程序状态的代码路径B后的应用程序状态,即对会影响应用程序状态的代码路径B进行SMT编码得到的应用程序状态,表示在应用程序状态上执行会影响应用程序状态的代码路径A后的应用程序状态;
语义规则为:会影响应用程序状态的代码路径A先执行后,不会导致会影响应用程序状态的代码路径B的路径条件失效,反之亦然,可表示为:
其中,符号表示实质蕴含,符号表示逻辑与,表示在设定的应用程序状态S上会影响应用程序状态的代码路径A的最终路径条件求值结果为真;表示在应用程序状态上会影响应用程序状态的代码路径A的最终路径条件求值结果为真,表示在设定的应用程序状态S上会影响应用程序状态的代码路径B的最终路径条件求值结果为真;表示在应用程序状态上会影响应用程序状态的代码路径B的最终路径条件求值结果为真。
8.一种全自动分布式一致性的分析系统,其特征在于,基于权利要求1~7任一项所述的方法实现,该系统包括:
程序分析组件,用于读取应用程序的代码,使用程序分析技术,将代码中每一会影响应用程序状态的代码路径分别编码为中间表达语言;
一致性分析组件,用于将每一会影响应用程序状态的代码路径对应的中间表达语言翻译为定理证明器能够识别的形式,再输入至所述定理证明器,通过所述定理证明器检查每一对会影响应用程序状态的代码路径是否能够并发执行,枚举完所有会影响应用程序状态的代码路径后,获得应用程序的弱分布式一致性分析结果。
9.一种处理设备,其特征在于,包括:一个或多个处理器;存储器,用于存储一个或多个程序;
其中,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如权利要求1~7任一项所述的方法。
10.一种可读存储介质,存储有计算机程序,其特征在于,当计算机程序被处理器执行时实现如权利要求1~7任一项所述的方法。
CN202310212470.3A 2023-03-07 2023-03-07 全自动分布式一致性的分析方法、系统、设备及存储介质 Active CN116069669B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310212470.3A CN116069669B (zh) 2023-03-07 2023-03-07 全自动分布式一致性的分析方法、系统、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310212470.3A CN116069669B (zh) 2023-03-07 2023-03-07 全自动分布式一致性的分析方法、系统、设备及存储介质

Publications (2)

Publication Number Publication Date
CN116069669A true CN116069669A (zh) 2023-05-05
CN116069669B CN116069669B (zh) 2023-06-16

Family

ID=86171642

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310212470.3A Active CN116069669B (zh) 2023-03-07 2023-03-07 全自动分布式一致性的分析方法、系统、设备及存储介质

Country Status (1)

Country Link
CN (1) CN116069669B (zh)

Citations (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6560774B1 (en) * 1999-09-01 2003-05-06 Microsoft Corporation Verifier to check intermediate language
US20030159132A1 (en) * 2002-02-20 2003-08-21 Microsoft Corporation Conformance execution of non-deterministic specifications for components
US20040268307A1 (en) * 2003-06-27 2004-12-30 Microsoft Corporation Representing type information in a compiler and programming tools framework
US20080281563A1 (en) * 2007-05-07 2008-11-13 Nec Laboratories America Modeling and verification of concurrent systems using smt-based bmc
US20120011492A1 (en) * 2010-07-07 2012-01-12 Nec Laboratories America, Inc. Systems and methods for concurrency analysis
US8532978B1 (en) * 2008-10-31 2013-09-10 Afrl/Rij Natural language interface, compiler and de-compiler for security policies
US20140019949A1 (en) * 2012-07-10 2014-01-16 Loring Craymer Method and System for Automated Improvement of Parallelism in Program Compilation
US20160299748A1 (en) * 2015-04-10 2016-10-13 Oracle International Corporation Declarative program engine for large-scale program analysis
CN110287089A (zh) * 2019-05-07 2019-09-27 华东师范大学 一种基于中间格式及smt技术的微内核ipc验证方法
CN110989997A (zh) * 2019-12-04 2020-04-10 电子科技大学 基于定理证明的形式化验证方法
US20200201838A1 (en) * 2018-12-20 2020-06-25 Sri International Middleware to automatically verify smart contracts on blockchains
CN111858322A (zh) * 2020-07-10 2020-10-30 中国科学技术大学 一种Python语言特征自动识别系统和方法
CN112636958A (zh) * 2020-12-12 2021-04-09 东北大学 意图驱动网络中的策略自动化验证技术
CN112766505A (zh) * 2021-01-12 2021-05-07 深圳大学 非单调推理在逻辑动作语言系统刻画中的知识表示方法
CN112925524A (zh) * 2021-03-05 2021-06-08 清华大学 一种检测驱动程序中不安全直接存储器访问的方法及装置
CN115268853A (zh) * 2022-08-19 2022-11-01 浙江大学 一种基于约束求解器的自动形式验证方法与装置

Patent Citations (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6560774B1 (en) * 1999-09-01 2003-05-06 Microsoft Corporation Verifier to check intermediate language
US20030159132A1 (en) * 2002-02-20 2003-08-21 Microsoft Corporation Conformance execution of non-deterministic specifications for components
US20040268307A1 (en) * 2003-06-27 2004-12-30 Microsoft Corporation Representing type information in a compiler and programming tools framework
US20080281563A1 (en) * 2007-05-07 2008-11-13 Nec Laboratories America Modeling and verification of concurrent systems using smt-based bmc
US8532978B1 (en) * 2008-10-31 2013-09-10 Afrl/Rij Natural language interface, compiler and de-compiler for security policies
US20120011492A1 (en) * 2010-07-07 2012-01-12 Nec Laboratories America, Inc. Systems and methods for concurrency analysis
US20140019949A1 (en) * 2012-07-10 2014-01-16 Loring Craymer Method and System for Automated Improvement of Parallelism in Program Compilation
US20160299748A1 (en) * 2015-04-10 2016-10-13 Oracle International Corporation Declarative program engine for large-scale program analysis
US20200201838A1 (en) * 2018-12-20 2020-06-25 Sri International Middleware to automatically verify smart contracts on blockchains
CN110287089A (zh) * 2019-05-07 2019-09-27 华东师范大学 一种基于中间格式及smt技术的微内核ipc验证方法
CN110989997A (zh) * 2019-12-04 2020-04-10 电子科技大学 基于定理证明的形式化验证方法
CN111858322A (zh) * 2020-07-10 2020-10-30 中国科学技术大学 一种Python语言特征自动识别系统和方法
CN112636958A (zh) * 2020-12-12 2021-04-09 东北大学 意图驱动网络中的策略自动化验证技术
CN112766505A (zh) * 2021-01-12 2021-05-07 深圳大学 非单调推理在逻辑动作语言系统刻画中的知识表示方法
CN112925524A (zh) * 2021-03-05 2021-06-08 清华大学 一种检测驱动程序中不安全直接存储器访问的方法及装置
CN115268853A (zh) * 2022-08-19 2022-11-01 浙江大学 一种基于约束求解器的自动形式验证方法与装置

Non-Patent Citations (5)

* Cited by examiner, † Cited by third party
Title
ALEXEY GOTSMAN等: "Cause I’m Strong Enough:Reasoning about Consistency Choices in Distributed Systems", Retrieved from the Internet <URL:https://dl.acm.org/doi/pdf/10.1145/2837614.2837625> *
KUPER等: "Toward Domain-Specific Solvers for Distributed Consistency", Retrieved from the Internet <URL:https://par.nsf.gov/biblio/10127267> *
何炎祥;吴伟;陈勇;李清安;刘健博;: "一种用于类C语言环境的安全的类型化内存模型", 计算机研究与发展, no. 11 *
徐文义;陈意云;李兆鹏;: "断言语言支持自定义谓词的程序验证器原型", 小型微型计算机系统, no. 07 *
王涛等: "基于自适应事件触发分布式模型预测控制的多智能体系统跟踪一致性", 《中国科学》 *

Also Published As

Publication number Publication date
CN116069669B (zh) 2023-06-16

Similar Documents

Publication Publication Date Title
JP7090778B2 (ja) 影響分析
Furche et al. DIADEM: thousands of websites to a single database
US8176470B2 (en) Collaborative derivation of an interface and partial implementation of programming code
KR100856806B1 (ko) 수수료-기반 액세스의 제공 방법, 추상적 질의의 형성방법, 물리적 데이터의 수정 방법, 로직 프레임워크 제공방법, 컴퓨터 판독 가능 매체, 컴퓨터 및 수수료 정보의디스플레이 방법
Cunha et al. From spreadsheets to relational databases and back
US8701087B2 (en) System and method of annotating class models
Hamie et al. Interpreting the object constraint language
Stolee et al. Identification, impact, and refactoring of smells in pipe-like web mashups
Bantilan pandera: Statistical Data Validation of Pandas Dataframes.
Fellmann et al. A query-driven approach for checking the semantic correctness of ontology-based process representations
Liu et al. An XML-enabled data extraction toolkit for web sources
Suárez-Cabal et al. Incremental test data generation for database queries
CN116069669B (zh) 全自动分布式一致性的分析方法、系统、设备及存储介质
Rasool Customizable feature based design pattern recognition integrating multiple techniques
CN115039083A (zh) 逻辑连接程序执行时生成的异步算法合法性验证使能方法
Wojszczyk et al. The process of verifying the implementation of design patterns—used data models
Pettit et al. The MySQL Workshop: A practical guide to working with data and managing databases with MySQL
Bull Software maintenance by program transformation in a wide spectrum language
Almendros‐Jiménez et al. Automatic property‐based testing and path validation of XQuery programs
Aksoy et al. MATAWS: A multimodal approach for automatic WS semantic annotation
de Boer et al. A logical viewpoint on architectures
Fisher et al. An automated analysis methodology to detect inconsistencies in web services with WSDL interfaces
Garg et al. Insight to model clone’s differentiation, classification, and visualization
Gurdeep Singh et al. GraphRedex: Look at your research
Andrews et al. Analyzing manuscript traditions using constraint-based data mining

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
GR01 Patent grant
GR01 Patent grant