CN110347588B - 软件验证方法、装置、计算机设备和存储介质 - Google Patents
软件验证方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN110347588B CN110347588B CN201910480992.5A CN201910480992A CN110347588B CN 110347588 B CN110347588 B CN 110347588B CN 201910480992 A CN201910480992 A CN 201910480992A CN 110347588 B CN110347588 B CN 110347588B
- Authority
- CN
- China
- Prior art keywords
- state machine
- protocol
- state
- requirements
- meets
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 57
- 238000012795 verification Methods 0.000 claims abstract description 61
- 230000006870 function Effects 0.000 claims description 63
- 238000006243 chemical reaction Methods 0.000 claims description 40
- 238000004590 computer program Methods 0.000 claims description 16
- 230000007704 transition Effects 0.000 claims description 14
- 238000012217 deletion Methods 0.000 claims description 3
- 230000037430 deletion Effects 0.000 claims description 3
- 230000008569 process Effects 0.000 description 11
- 238000010586 diagram Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 4
- 238000001514 detection method Methods 0.000 description 3
- 230000004048 modification Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 3
- 230000009471 action Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 230000001360 synchronised effect Effects 0.000 description 2
- 238000004566 IR spectroscopy Methods 0.000 description 1
- 108700031620 S-acetylthiorphan Proteins 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005538 encapsulation Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000010365 information processing Effects 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000013515 script Methods 0.000 description 1
- 238000013514 software validation Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000026676 system process Effects 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
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
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)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请涉及一种软件验证方法、装置、计算机设备和存储介质。所述方法包括:获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;将所述状态机规约转换为实现代码;通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;通过验证器验证所述状态机规约是否满足所述声明规约的要求;若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。采用本方法能够快速进行软件验证,提高软件验证效率,同时实现验证通用性。
Description
技术领域
本申请涉及信息处理技术领域,特别是涉及一种软件验证方法、装置、计算机设备和存储介质。
背景技术
随着互联网技术的发展,通过形式化验证的方式提前验证***软件的正确性能够有效避免由于软件出现问题而导致整个***崩溃。当前现有的形式化验证工具,基于一阶逻辑求解的形式化验证工具中,以SMT求解器的较多。
传统的形式化验证方式主要包括模型检测和定理证明,模型检测方式是基于有限模型并检验该模型期望特性的验证技术,然而,模型检测方式无法直接验证代码本身,同时很难表达复杂的***;定理证明方式是将***及其特性均以某种数学逻辑公式表示的验证技术,然而,定理证明方式需要专业的数学定理知识以及定理证明器的支持,这种半自动化的验证工具不仅需要花费大量的人力来编写相关规约,而且对研发人员的门槛要求较高,需要专业人员设计和开发相关软件。
发明内容
基于此,有必要针对上述技术问题,提供一种能够快速进行软件验证,提高软件验证效率,同时实现验证通用性的软件验证方法、装置、计算机设备和存储介质。
一种软件验证方法,所述方法包括:
获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;
将所述状态机规约转换为实现代码;
通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
通过验证器验证所述状态机规约是否满足所述声明规约的要求;
若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
在其中一个实施例中,所述状态机规约和所述声明规约按照预先定义的书写规则书写包括:
所述状态机规约通过Python语言书写,所述状态机规约用于描述***功能及***接口的正确性;
在所述状态机规约的基础上书写所述声明规约,所述声明规约用于描述***属性及***不变量信息;
其中,所述状态机规约包括抽象状态机规约和状态转换规约;
优选地,在Python语言的函数定义中增加返回值信息;
将Python函数的第一个参数设置为***状态空间的对象参数;
通过预设符号对所述Python函数的其他参数的参数类型和参数名称进行分割。
在其中一个实施例中,所述状态机规约通过Python语言书写包括:
通过抽象状态模型描述所述状态机规约的状态空间,其中,所述抽象状态模型包括***对外接口集合、状态机状态集合、输出集合、初始化状态以及操作转换;
优选地,利用数据结构构建多种***对象,其中,所述数据结构包括:数据类型、数据变量、***对象类型以及状态机对象;
根据所述多种***对象构建所述抽象状态机规约;
进一步优选地,设置至少一种前置条件,所述前置条件用于判断***调用能否执行;
若满足所述前置条件,则***状态机由第一状态空间转换为第二状态空间。
在其中一个实施例中,所述将所述状态机规约转换为实现代码包括:
通过翻译器将所述状态机规约转换为初始C语言代码;
对所述初始C语言代码进行人工修改,得到最终C语言代码;
将所述最终C语言代码转换为编译***的中间表示,并将所述中间表示作为***能够识别的所述实现代码。
在其中一个实施例中,所述通过翻译器将所述状态机规约转换为初始C语言代码包括:数据结构转换和函数转换,其中,
所述数据结构转换包括将所述状态机规约中的内核对象转换为所述初始C语言代码中的struct结构体,其中,所述内核对象以类的方式描述;
所述函数转换包括将所述状态机规约中的函数转换为Python语法树。
在其中一个实施例中,所述方法还包括:
若通过验证,则将所述中间表示编译为***镜像;
优选地,所述方法还包括:
遍历已知的抽象语法树,收集相关信息并对所述相关信息进行分类;
根据所述抽象语法树的结构以及预先定义的语法转换规则,将所述抽象语法树转换为符合C语言语义规范的形式,得到所述Python语法树;
根据所述Python语法树进行函数的内部转换,包括所述类函数的转换、状态空间变量的删除以及引用指针的转换;
将所述Python语法树转换成所述初始C语言代码。
在其中一个实施例中,所述通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求包括:
将转换后的所述实现代码分别输入求解器和符号执行引擎中,依次通过所述求解器和所述符号执行引擎对转换后的所述实现代码进行求解,验证转换后的所述实现代码是否满足所述状态机规约的要求;
优选地,分别获取所述状态机规约和所述实现代码的状态空间;
获取***与所述状态机规约之间的对等函数;
将所述状态机规约的状态空间、所述实现代码的状态空间以及所述对等函数按照满足一阶逻辑的方式提供给求解器进行求解,得到求解结果;
根据所述求解结果判断所述实现代码是否满足所述状态机规约的要求;
进一步优选地,所述通过验证器验证所述状态机规约是否满足所述声明规约的要求包括:
将所述状态机规约通过所述符号执行引擎获取所述状态空间,其中,所述状态空间通过一阶逻辑表达式表示,将按照一阶逻辑表达式表示的所述状态空间与所述声明规约同时输入求解器中进行求解,验证所述状态机规约是否满足所述声明规约的要求。
一种软件验证装置,所述装置包括:
规约获取模块,用于获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;
转换模块,用于将所述状态机规约转换为实现代码;
第一验证模块,用于通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
第二验证模块,用于通过验证器验证所述状态机规约是否满足所述声明规约的要求;
判断模块,用于若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;
将所述状态机规约转换为实现代码;
通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
通过验证器验证所述状态机规约是否满足所述声明规约的要求;
若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;
将所述状态机规约转换为实现代码;
通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
通过验证器验证所述状态机规约是否满足所述声明规约的要求;
若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
上述软件验证方法、装置、计算机设备和存储介质,通过获取按照预先定义的书写规则书写的状态机规约和声明规约,并将该状态机规约转换为实现代码输入验证器中进行验证输入验证器中进行验证,若转换后的实现代码满足状态机规约的要求,且状态机规约满足声明规约的要求,则通过验证。从而达到快速验证软件及函数正确性的目的。
附图说明
图1为一个实施例中软件验证方法的形式化验证框架图;
图2为一个实施例中软件验证方法的流程示意图;
图3为一个实施例中状态机规约转换步骤的流程示意图;
图4为另一个实施例中状态机规约转换步骤的流程示意图;
图5为一个实施例中软件验证步骤的流程示意图;
图6为一个实施例中软件验证装置的结构框图;
图7为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请提供的软件验证方法,可以应用于如图1所示的形式化验证框架中。根据预先定义的规约的书写规则书写两种类型的规约,即状态机(state-machine)规约和声明规约,将状态机规约首先通过翻译器(Parser)转换为初始C语言代码,再通过人工的方式对生成的初始C语言代码进行简单的局部添加和修改,得到最终C语言代码,接着将最终C语言代码通过LLVM编译***转换为该编译***的中间表示(LLVM IR)输入验证器中进行验证;同时,将状态机规约输入验证器中进行验证,当转换后的实现代码满足状态机规约的要求,且状态机规约满足声明规约的要求时,则通过验证,否则给出反例。
在一个实施例中,如图2所示,提供了一种软件验证方法,以该方法应用于图1中的形式化验证框架为例进行说明,包括以下步骤:
步骤S202,获取规约。
其中,所述规约包括状态机规约和声明规约;规约是程序的上层抽象的一种表示形式,描述了***的相关特性和对应程序要满足的要求;状态机用于表示***的抽象状态,能够描述***的整体状态以及经过状态转换后***的变化情况;声明规约以谓词的形式表示,用于描述***的上层属性信息。
具体地,所述状态机规约和所述声明规约按照预先定义的书写规则书写,也就是说,首先在形式化验证框架中预先定义规约的书写规则,然后按照该规则书写状态机规约和声明规约,最后获取书写好的状态机规约和声明规约。
步骤S204,将所述状态机规约转换为实现代码。
其中,实现代码指的是验证器能够识别的代码形式。具体地,在形式化验证框架中将步骤S202中获取的状态机规约转换为验证器能够识别的实现代码。
步骤S206,通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求。
具体地,在形式化验证框架中将步骤S204中转换后的实现代码输入验证器中,并通过该验证器验证该实现代码的正确性。
步骤S208,通过验证器验证所述状态机规约是否满足所述声明规约的要求。
具体地,在形式化验证框架中将步骤S202中获取的状态机规约输入验证器中,并通过该验证器验证该状态机规约是否满足声明规约的要求。
步骤S210,若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
具体地,当转换后的实现代码满足状态机规约的要求,且状态机规约满足声明规约的要求时,则通过验证,否则给出反例,即在输出结果中给出相关信息供程序员查找错误。
上述软件验证方法中,通过获取按照预先定义的书写规则书写的状态机规约和声明规约,并将该状态机规约转换为实现代码输入验证器中进行验证,同时将该状态机规约输入验证器中进行验证,若转换后的实现代码满足状态机规约的要求,且状态机规约满足声明规约的要求,则通过验证。从而达到快速验证软件及函数正确性的目的。
在其中一个实施例中,步骤S202具体包括以下步骤:
步骤S2022,所述状态机规约通过Python语言书写。
其中,所述状态机规约用于描述***功能及***接口的正确性;所述状态机规约包括抽象状态机规约和状态转换规约;抽象状态机规约用于描述***的整体状态空间、***中包含的***对象以及这些***对象的相关信息,例如:数据类型、属性等信息;状态转换规约用于描述***接口以及***接口被调用后,***整体状态空间的变化情况。
作为一种可选的实施方式,步骤S2022包括:通过抽象状态模型描述所述状态机规约的状态空间,其中,所述抽象状态模型包括***对外接口集合、状态机状态集合、输出集合、初始化状态以及操作转换。
具体地,可以通过抽象状态模型<T,S,O,init,step>描述状态机规约的状态空间,其中,T表示***对外接口集合;S表示状态机状态集合;O表示输出集合;init表示初始化状态;step表示一种操作转换。进一步,***的转换过程为
step:S×T→S′×O
表示状态集合S对应到转化集合会被映射到另外一个状态集合S′,并给出输出结果集合O。
作为另一种可选的实施方式,步骤S2022中抽象状态机规约的构建过程具体包括以下步骤:
步骤S2023,利用数据结构构建多种***对象。
其中,所述数据结构包括:数据类型、数据变量、***对象类型以及状态机对象。
具体地,可以利用Python相关的数据类型或z3py库提供的数据类型构建***对象,例如:在形式化验证框架中使用z3.BitVecSort(64)来表示size_t类型的变量,代表该***对象是一个64bit的向量类型,这种数据类型允许以符号执行的方式运行,从而获得整个函数执行后的状态空间;使用z3.BitVecSort(1,64)来表示size_t=1类型的常量。
具体地,可以利用Python提供的类函数Class构建***对象,通过数据结构(Map,Refcnt)来描述Class内的属性信息,其中,Map描述了***对象所包含的属性;Refcnt描述了该***对象相对于其他***对象的资源使用情况。
步骤S2025,根据所述多种***对象构建所述抽象状态机规约。
作为另一种可选的实施方式,步骤S2022中状态转换规约的书写规则具体包括以下步骤:
步骤S2023a,设置至少一种前置条件,所述前置条件用于判断***调用能否执行。
具体地,可以先将***进程设置为预设状态,其中,预设状态指的是***的“可运行”状态,通过逻辑表达式集合condition来设置至少一种判断该***调用能够执行的前置条件。由于状态转换过程中可能包含多个分支判断,因此,在描述状态机的整体状态转换过程中通常需要设置多种前置条件。
步骤S2025a,若满足所述前置条件,则***状态机由第一状态空间转换为第二状态空间。
其中,第一状态空间指的是转换前的状态空间;第二状态空间指的是转换后的状态空间;具体地,通过形式化验证框架提供的util工具集中的If函数进行判断,若满足步骤S2023a中设置的前置条件,则***状态机转换为一个新的状态,否则保持原来的状态空间不变。
作为另一种可选的实施方式,步骤S2022中状态转换规约的书写规则还包括:通过设置所述第一状态空间中的属性信息,建立所述第一状态空间的副本。
具体地,通过设置new状态空间中的相关属性信息,即new=old.copy()对第一状态空间进行复制,为状态空间的转换建立了副本,从而确保在状态转换过程中不会破坏原来状态空间的相关信息。
步骤S2024,在所述状态机规约的基础上书写所述声明规约。
其中,在形式化验证框架中声明规约主要描述资源的排他使用关系以及资源的共享引用计数关系。具体地,以操作***为例进行说明,由于操作***的排他性和进程之间的隔离性,可以通过描述页表的相关属性确保该***的状态空间在状态转换前后其属性保持不变,并通过添加check函数来检查这些属性。
在其中一个实施例中,步骤S202中所述状态机规约和所述声明规约按照预先定义的书写规则书写具体包括以下步骤:
步骤S2022a,在Python语言的函数定义中增加返回值信息。
具体地,由于Python语言的函数没有返回类型,为了保证状态机规约的正确转换,需要在Python语言的函数定义中增加返回值信息,可以通过‘_’来分辨函数的返回值类型,例如:def int_func_name(paramtype_xxx)可以被翻译为intfunc_name(paramtype xxx){}。
步骤S2024a,将Python函数的第一个参数设置为***状态空间的对象参数。
步骤S2026a,通过预设符号对所述Python函数的其他参数的参数类型和参数名称进行分割。
具体地,可以通过预设符号‘_’对其他参数的参数类型和参数名称进行分割,例如:pid_t_pid可以被翻译为pid_t pid。
上述软件验证方法中,程序员按照预先定义的书写规则使用Python语言书写相关规约,能够减少人员投入以及形式化验证的难度,同时避免了设计和实现无法统一的现状。
在其中一个实施例中,如图3所示,步骤S204具体包括以下步骤:
步骤S2042,通过翻译器将所述状态机规约转换为初始C语言代码。
具体地,通过翻译器将状态机规约自动转换为半完成状态的初始C语言代码。
作为一种可选的实施方式,步骤S2042包括数据结构转换和函数转换,具体包括以下步骤:
步骤S2043,将所述状态机规约中的内核对象转换为所述初始C语言代码中的struct结构体,其中,所述内核对象以类的方式描述。
具体地,在状态机规约转换为实现代码的过程中,需要对状态机规约的数据结构进行转换,即将状态机规约中的内核对象(以Class类的方式描述)转换为所述初始C语言代码中的struct结构体。
步骤S2045,将所述状态机规约中的函数转换为Python语法树。
具体地,在状态机规约转换为实现代码的过程中,需要对状态机规约的函数进行转换,即将状态机规约中的函数转换为Python语法树,具体通过Python库中的抽象语法树(Abstract Syntax Tree,AST)改变已有的语法树并重新组织程序。
作为一种可选的实施方式,如图4所示,步骤S2045之后还包括以下步骤:
步骤S2045a,遍历已知的抽象语法树,收集相关信息并对所述相关信息进行分类。
其中,收集的相关信息包括要转换的函数名称集合、每个函数的逻辑表达式集合condition、新旧状态机变量集合等信息。
步骤S2045b,根据所述抽象语法树的结构以及预先定义的语法转换规则,将所述抽象语法树转换为符合C语言语义规范的形式,得到所述Python语法树。
具体地,在形式化验证框架中可以通过记录跳转条件以及对应的逻辑代码来进行抽象语法树的转换,使其尽可能满足转换条件,例如:已知AST中存在跳转条件util.if函数,需要将该函数转换为符合C语言语义规范的if(condition){}else{}等形式。
步骤S2045c,根据所述Python语法树进行函数的内部转换,包括所述类函数的转换、状态空间变量的删除以及引用指针的转换。
步骤S2045d,将所述Python语法树转换成所述初始C语言代码。
步骤S2044,对所述初始C语言代码进行人工修改,得到最终C语言代码。
具体地,在步骤S2042得到的初始C语言代码的基础上,通过人工的方式进行简单的局部添加和修改,例如:资源的组织等操作需要通过链表人为添加,从而得到最终C语言代码。
步骤S2046,将所述最终C语言代码转换为编译***的中间表示,并将所述中间表示作为***能够识别的所述实现代码。
作为一种可选的实施方式,若通过验证,则将所述中间表示编译为***镜像。
具体地,若步骤S204中转换后的实现代码满足状态机规约的要求,同时,步骤S202中获取到的状态机规约满足声明规约的要求,则将步骤S2046中的中间表示最终编译为***镜像。
上述软件验证方法中,通过翻译器将状态机规约自动转换为形式化验证框架下***能够识别的实现代码,能够快速进行软件验证,提高软件验证效率,同时解决了现有的验证工具只局限于特定的编程语言的弊端,实现验证通用性。
在其中一个实施例中,如图5所示,步骤S206具体包括以下步骤:
步骤S2062,分别获取所述状态机规约和所述实现代码的状态空间。
具体地,通过符号执行的方法分别获取步骤S202中获取的状态机规约的状态空间以及步骤S204中转换后得到的实现代码的状态空间。其中,符号执行是一种程序分析技术,它可以通过分析程序来得到让特定代码区域执行的输入。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。
步骤S2064,获取***与所述状态机规约之间的对等函数。
其中,对等函数用于描述***的LLVM IR数据结构与抽象状态之间的等价关系。例如:对等函数Llvm_global(‘@current’)==state.current,通过Llvm_global函数在LLVMIR中查找current进程,它对应实现代码中的当前的PID,state.current代表在抽象状态规约中的当前的PID。
步骤S2066,将所述状态机规约的状态空间、所述实现代码的状态空间以及所述对等函数按照满足一阶逻辑的方式提供给求解器进行求解,得到求解结果。
其中,求解器指的是在特定理论下判定一阶逻辑公式可满足性问题的软件工具,包括Z3、SATP等。具体地,将步骤S2062中获取到的状态机规约的状态空间、实现代码的状态空间以及步骤S2064中获取到的对等函数同时输入求解器中,通过求解器的符号执行引擎执行函数的动态符号求解。
进一步,在输入求解器之前还需要符合执行的过程,首先排除LLVM IR中未定义的行为,其中,未定义的行为包括除零操作以及未定义的操作等,可以通过框架提供的脚本实现该操作;其次将LLVM IR映射到求解器中,可以通过LLVM IR的封装操作实现。
步骤S2068,根据所述求解结果判断所述实现代码是否满足所述状态机规约的要求。
在其中一个实施例中,步骤S206还包括:将转换后的所述实现代码分别输入求解器和符号执行引擎中,依次通过所述求解器和所述符号执行引擎对转换后的所述实现代码进行求解,验证转换后的所述实现代码是否满足所述状态机规约的要求。
其中,符合执行引擎是基于求解器设计并开发的,提供了函数的动态符号执行求解过程,例如:a=BitVecSort(64),表示一个64位的符号化变量,def fun(a),将fun的参数使用符号化的参数a进行输入,即将符号化变量输入到该执行函数中,则函数fun将完成符号执行。
具体地,步骤S206的验证过程包括求解器验证和符号执行引擎验证两部分,即将转换后的实现代码分别输入求解器和符号执行引擎中,依次通过求解器和符号执行引擎对转换后的实现代码进行求解验证。
上述软件验证方法中,通过将状态机规约的状态空间、实现代码的状态空间以及对等函数同时输入求解器中进行求解,并根据求解结果判断该实现代码是否满足该状态机规约的要求,能够方便、快速的实现软件验证,减少了形式化验证的难度,提高了验证效率。
在其中一个实施例中,步骤S208包括:将所述状态机规约通过所述符号执行引擎获取所述状态空间,其中,所述状态空间通过一阶逻辑表达式表示,将按照一阶逻辑表达式表示的所述状态空间与所述声明规约同时输入求解器中进行求解,验证所述状态机规约是否满足所述声明规约的要求。
具体地,步骤S208首先通过符号执行引擎获取状态机规约的状态空间,并将按照一阶逻辑表达式表示的状态空间与获取到的声明规约同时输入求解器中进行求解,验证该状态机规约是否满足该声明规约的要求。
应该理解的是,虽然图2-5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2-5中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图6所示,提供了一种软件验证装置,包括:规约获取模块301、转换模块302、第一验证模块303、第二验证模块304和判断模块305,其中:
规约获取模块301用于获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;
转换模块302用于将所述状态机规约转换为实现代码;
第一验证模块303用于通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
第二验证模块304用于通过验证器验证所述状态机规约是否满足所述声明规约的要求;
判断模块305用于若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
在其中一个实施例中,规约获取模块301具体用于所述状态机规约通过Python语言书写,所述状态机规约用于描述***功能及***接口的正确性;在所述状态机规约的基础上书写所述声明规约,所述声明规约用于描述***属性及***的变量信息;其中,所述状态机规约包括抽象状态机规约和状态转换规约。
在其中一个实施例中,规约获取模块301具体用于通过抽象状态模型描述所述状态机规约的状态空间,其中,所述抽象状态模型包括***对外接口集合、状态机状态集合、输出集合、初始化状态以及操作转换。
在其中一个实施例中,规约获取模块301具体用于利用数据结构构建多种***对象,其中,所述数据结构包括:数据类型、数据变量、***对象类型以及状态机对象;根据所述多种***对象构建所述抽象状态机规约。
在其中一个实施例中,规约获取模块301具体用于设置至少一种前置条件,所述前置条件用于判断***调用能否执行;若满足所述前置条件,则***状态机由第一状态空间转换为第二状态空间。
在其中一个实施例中,规约获取模块301具体用于在Python语言的函数定义中增加返回值信息;将Python函数的第一个参数设置为***状态空间的对象参数;通过预设符号对所述Python函数的其他参数的参数类型和参数名称进行分割。
在其中一个实施例中,转换模块302具体用于通过翻译器将所述状态机规约转换为初始C语言代码;对所述初始C语言代码进行人工修改,得到最终C语言代码;将所述最终C语言代码转换为编译***的中间表示,并将所述中间表示作为***能够识别的所述实现代码。
在其中一个实施例中,转换模块302具体用于将所述状态机规约中的内核对象转换为所述初始C语言代码中的struct结构体,其中,所述内核对象以类的方式描述;将所述状态机规约中的函数转换为Python语法树。
在其中一个实施例中,第一验证模块303具体用于分别获取所述状态机规约和所述实现代码的状态空间;获取***与所述状态机规约之间的对等函数;将所述状态机规约的状态空间、所述实现代码的状态空间以及所述对等函数按照满足定理的一阶逻辑的方式提供给求解器进行求解,得到求解结果;根据所述求解结果判断所述实现代码是否满足所述状态机规约的要求。
在其中一个实施例中,第一验证模块303具体用于将转换后的所述实现代码分别输入求解器和符号执行引擎中,依次通过所述求解器和所述符号执行引擎对转换后的所述实现代码进行求解,验证转换后的所述实现代码是否满足所述状态机规约的要求。
在其中一个实施例中,第二验证模块304具体用于将所述状态机规约通过所述符号执行引擎获取所述状态空间,其中,所述状态空间通过一阶逻辑表达式表示,将按照一阶逻辑表达式表示的所述状态空间与所述声明规约同时输入求解器中进行求解,验证所述状态机规约是否满足所述声明规约的要求。
在其中一个实施例中,还包括***镜像编译模块,用于若通过验证,则将所述中间表示编译为***镜像。
关于软件验证装置的具体限定可以参见上文中对于软件验证方法的限定,在此不再赘述。上述软件验证装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图7所示。该计算机设备包括通过***总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作***、计算机程序和数据库。该内存储器为非易失性存储介质中的操作***和计算机程序的运行提供环境。该计算机设备的数据库用于存储软件验证数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种软件验证方法。
本领域技术人员可以理解,图7中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;
将所述状态机规约转换为实现代码;
通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
通过验证器验证所述状态机规约是否满足所述声明规约的要求;
若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
在另一个实施例中,处理器执行计算机程序时还可以实现上述任一实施例中软件验证方法的步骤。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
获取规约,其中,所述规约包括状态机规约和声明规约,所述状态机规约和所述声明规约按照预先定义的书写规则书写;
将所述状态机规约转换为实现代码;
通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
通过验证器验证所述状态机规约是否满足所述声明规约的要求;
若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
在一个实施例中,计算机程序被处理器执行时还可以实现上述任一实施例中软件验证方法的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (14)
1.一种软件验证方法,其特征在于,所述方法包括:
通过Python语言书写状态机规约,在所述状态机规约的基础上书写声明规约;所述状态机规约用于描述***功能及***接口的正确性;所述声明规约用于描述***属性及***不变量信息;其中,所述状态机规约包括抽象状态机规约和状态转换规约;
将所述状态机规约转换为实现代码;
通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
通过验证器验证所述状态机规约是否满足所述声明规约的要求;
若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
2.根据权利要求1所述的方法,其特征在于,所述通过Python语言书写状态机规约,在所述状态机规约的基础上书写声明规约包括:
在Python语言的函数定义中增加返回值信息;
将Python函数的第一个参数设置为***状态空间的对象参数;
通过预设符号对所述Python函数的其他参数的参数类型和参数名称进行分割。
3.根据权利要求1所述的方法,其特征在于,所述通过Python语言书写状态机规约包括:
通过抽象状态模型描述所述状态机规约的状态空间,其中,所述抽象状态模型包括***对外接口集合、状态机状态集合、输出集合、初始化状态以及操作转换。
4.根据权利要求3所述的方法,其特征在于,所述通过抽象状态模型描述所述状态机规约的状态空间包括:
利用数据结构构建多种***对象,其中,所述数据结构包括:数据类型、数据变量、***对象类型以及状态机对象;
根据所述多种***对象构建所述抽象状态机规约。
5.根据权利要求1所述的方法,其特征在于,所述通过Python语言书写状态机规约包括:
设置至少一种前置条件,所述前置条件用于判断***调用能否执行;
若满足所述前置条件,则***状态机由第一状态空间转换为第二状态空间。
6.根据权利要求1所述的方法,其特征在于,所述将所述状态机规约转换为实现代码包括:
通过翻译器将所述状态机规约转换为初始C语言代码;
对所述初始C语言代码进行人工修改,得到最终C语言代码;
将所述最终C语言代码转换为编译***的中间表示,并将所述中间表示作为***能够识别的所述实现代码。
7.根据权利要求6所述的方法,其特征在于,所述通过翻译器将所述状态机规约转换为初始C语言代码包括:数据结构转换和函数转换,其中,
所述数据结构转换包括将所述状态机规约中的内核对象转换为所述初始C语言代码中的struct结构体,其中,所述内核对象以类的方式描述;
所述函数转换包括将所述状态机规约中的函数转换为Python语法树。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
遍历已知的抽象语法树,收集相关信息并对所述相关信息进行分类;
根据所述抽象语法树的结构以及预先定义的语法转换规则,将所述抽象语法树转换为符合C语言语义规范的形式,得到所述Python语法树;
根据所述Python语法树进行函数的内部转换,包括类函数的转换、状态空间变量的删除以及引用指针的转换;
将所述Python语法树转换成所述初始C语言代码;
所述若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证之后,还包括:
将所述中间表示编译为***镜像。
9.根据权利要求1所述的方法,其特征在于,所述通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求包括:
将转换后的所述实现代码分别输入求解器和符号执行引擎中,依次通过所述求解器和所述符号执行引擎对转换后的所述实现代码进行求解,验证转换后的所述实现代码是否满足所述状态机规约的要求。
10.根据权利要求1至9中任意一项所述的方法,其特征在于,所述验证转换后的所述实现代码是否满足所述状态机规约的要求包括:
分别获取所述状态机规约和所述实现代码的状态空间;
获取***与所述状态机规约之间的对等函数;
将所述状态机规约的状态空间、所述实现代码的状态空间以及所述对等函数按照满足一阶逻辑的方式提供给求解器进行求解,得到求解结果;
根据所述求解结果判断所述实现代码是否满足所述状态机规约的要求。
11.根据权利要求10所述的方法,其特征在于,所述通过验证器验证所述状态机规约是否满足所述声明规约的要求包括:
将所述状态机规约通过所述符号执行引擎获取所述状态空间,其中,所述状态空间通过一阶逻辑表达式表示,将按照一阶逻辑表达式表示的所述状态空间与所述声明规约同时输入求解器中进行求解,验证所述状态机规约是否满足所述声明规约的要求。
12.一种软件验证装置,其特征在于,所述装置包括:
规约获取模块,用于通过Python语言书写状态机规约,在所述状态机规约的基础上书写声明规约;所述状态机规约用于描述***功能及***接口的正确性;所述声明规约用于描述***属性及***不变量信息;其中,所述状态机规约包括抽象状态机规约和状态转换规约;
转换模块,用于将所述状态机规约转换为实现代码;
第一验证模块,用于通过验证器验证转换后的所述实现代码是否满足所述状态机规约的要求;
第二验证模块,用于通过验证器验证所述状态机规约是否满足所述声明规约的要求;
判断模块,用于若转换后的所述实现代码满足所述状态机规约的要求,且所述状态机规约满足所述声明规约的要求,则通过验证。
13.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至11中任一项所述方法的步骤。
14.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至11中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910480992.5A CN110347588B (zh) | 2019-06-04 | 2019-06-04 | 软件验证方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910480992.5A CN110347588B (zh) | 2019-06-04 | 2019-06-04 | 软件验证方法、装置、计算机设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110347588A CN110347588A (zh) | 2019-10-18 |
CN110347588B true CN110347588B (zh) | 2024-03-15 |
Family
ID=68181498
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910480992.5A Active CN110347588B (zh) | 2019-06-04 | 2019-06-04 | 软件验证方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110347588B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112685315A (zh) * | 2021-01-05 | 2021-04-20 | 电子科技大学 | 面向c源码的自动化形式化验证工具及方法 |
CN113282492A (zh) * | 2021-05-24 | 2021-08-20 | 湖南大学 | 一种操作***内核形式化验证方法 |
CN117573537B (zh) * | 2023-11-23 | 2024-04-26 | 晞德求索(北京)科技有限公司 | 基于位向量smt的软件形式化验证方法、***及设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107111713A (zh) * | 2014-10-02 | 2017-08-29 | 微软技术许可有限责任公司 | 软件***的自动验证 |
CN108536581A (zh) * | 2018-03-08 | 2018-09-14 | 华东师范大学 | 一种针对源代码的运行时形式化验证方法及*** |
CN109240907A (zh) * | 2018-07-26 | 2019-01-18 | 华东师范大学 | 基于霍尔逻辑的嵌入式实时操作***的自动化验证方法 |
CN109634869A (zh) * | 2018-12-21 | 2019-04-16 | 中国人民解放军战略支援部队信息工程大学 | 基于语义等价验证的二进制翻译中间表示正确性测试方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080229261A1 (en) * | 2007-03-16 | 2008-09-18 | Microsoft Corporation | Design rule system for verifying and enforcing design rules in software |
-
2019
- 2019-06-04 CN CN201910480992.5A patent/CN110347588B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107111713A (zh) * | 2014-10-02 | 2017-08-29 | 微软技术许可有限责任公司 | 软件***的自动验证 |
CN108536581A (zh) * | 2018-03-08 | 2018-09-14 | 华东师范大学 | 一种针对源代码的运行时形式化验证方法及*** |
CN109240907A (zh) * | 2018-07-26 | 2019-01-18 | 华东师范大学 | 基于霍尔逻辑的嵌入式实时操作***的自动化验证方法 |
CN109634869A (zh) * | 2018-12-21 | 2019-04-16 | 中国人民解放军战略支援部队信息工程大学 | 基于语义等价验证的二进制翻译中间表示正确性测试方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110347588A (zh) | 2019-10-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Enoiu et al. | Automated test generation using model checking: an industrial evaluation | |
Gosain et al. | Static analysis: A survey of techniques and tools | |
Blouin et al. | Kompren: modeling and generating model slicers | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
CN110347588B (zh) | 软件验证方法、装置、计算机设备和存储介质 | |
US9983977B2 (en) | Apparatus and method for testing computer program implementation against a design model | |
US8291372B2 (en) | Creating graphical models representing control flow of a program manipulating data resources | |
Bergmann | Translating OCL to graph patterns | |
Langer et al. | Semantic model differencing utilizing behavioral semantics specifications | |
JP7394213B2 (ja) | スマートコントラクト処理方法、システム、コンピュータ機器、および読み取り可能な記憶媒体 | |
Beyer | Relational programming with CrocoPat | |
CN109597618B (zh) | 程序开发方法、装置、计算机设备及存储介质 | |
Tisi et al. | Improving higher-order transformations support in ATL | |
Pinto et al. | Aspect composition for multiple target languages using LARA | |
Torlak et al. | Applications and extensions of Alloy: past, present and future | |
CN103186463A (zh) | 确定软件的测试范围的方法和*** | |
CN115357898A (zh) | 一种java组件的依赖分析方法、装置及介质 | |
Gotti et al. | UML executable: A comparative study of UML compilers and interpreters | |
Kanav et al. | Modular Transformation from AF3 to nuXmv. | |
Kerkouche et al. | Uml activity diagrams and maude integrated modeling and analysis approach using graph transformation | |
CN115033212A (zh) | 航电***图元模型一体化构建方法、装置、计算机设备 | |
CN114153435A (zh) | 一种用于智能合约代码设计生成的eb2s***及使用方法 | |
Semeráth et al. | Validation of Derived Features and Well-Formedness Constraints in DSLs: By Mapping Graph Queries to an SMT-Solver | |
Arruda et al. | Automation and consistency analysis of test cases written in natural language: An industrial context | |
Straszak et al. | Model-driven acceptance test automation based on use cases |
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 | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20221212 Address after: No. 259-10, Hengxue Road, Fangqiao Street, Fenghua District, Ningbo, Zhejiang 315000 (self declaration) Applicant after: Ningbo Qianchuan Technology Co.,Ltd. Address before: No. 303, B1, No. 36, Haidian West Street, Haidian District, Beijing 100,089 Applicant before: Beijing QianChuan Technology Co.,Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant |