一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种用于Java软件的形式化验证方法及装置

2022-11-19 07:07:33 来源:中国专利 TAG:

一种用于java软件的形式化验证方法及装置
技术领域
1.本发明属于形式化方法领域,是一种用于java软件的形式化验证方法及装置。


背景技术:

2.现有的java源代码形式化验证工具主要包括loop、jack、taco、sireum/kiasan、esc/java2、openjml、key、krakatoa等。这些工具的情况概述如表1-1所示,其中loop和jack虽然在21世纪初很受欢迎,但是如今项目都处于荒废的状态,网站也不再可用;taco虽然通过有界模型检查验证难以直接数学证明的语句,但是不支持浮点数运算;sireum\kiasan声称他支持浮点数运算,但是实际上也不支持;openjml简单易用的java形式化验证工具基于自动smt求解,但是相应的验证能力比较弱。
3.表1-1常见java形式化工具概述
[0004][0005][0006]
这些java源代码验证工具的可用性,如表1-2所示。现有的java源代码形式化验证工具在使用前环境配置和后续使用过程中都存在较难以克服的问题,例如key不支持浮点运算和多线程,使得很难应用key于常见工业软件的形式化验证项目中。
[0007]
表1-2常见java形式化工具可用性
[0008][0009]
本发明的技术问题在于:
[0010]
调研结果表明,现有的java语言形式化验证工具很难满足常见工业软件的形式化验证需求。因此,本发明提出了一种用于java软件的新型形式化验证方法,以解决现有工具难以完成工业级java程序形式化验证的问题:
[0011]
1)java语言语义复杂,难以对浮点运算、多线程等行为进行语义建模;
[0012]
2)形式化验证对程序员的数学基础要求高;
[0013]
3)smt求解器难以求解无限循环下的约束条件;
[0014]
4)key不支持浮点运算和多线程,使得很难应用key于常见工业软件的形式化验证项目中;


技术实现要素:

[0015]
本发明为了解决上述技术问题,目的在于提供一种用于java软件的形式化验证方法及装置,一种用于工业界的java程序形式化验证,对装置多维度状态变化时间序列数据进行建模的方法,本发明是通过以下技术方案来实现的:
[0016]
本发明公开了一种用于java软件的形式化验证方法,包括
[0017]
s1:获得java程序源代码,并对java程序源代码进行词法分析、语法分析和语义分析,生成java扩展抽象语法树;
[0018]
s2:解析出java扩展抽象语法树中的常量、变量、继承关系和函数限定符,为其分配内存地址,生成中间表示代码;
[0019]
s3:对java程序需求文档进行自动化建模,翻译成对应的java形式化规约,其中,形式化规约主要包括java程序的表达不变式、安全性;
[0020]
s4:解析java程序规约,将形式化人员定义的java程序规约转换成对应的java程序规约的smt表达式;
[0021]
s5:解析步骤s3中的中间表示代码的指令含义,根据指令含义将代码转换为符号值,根据符号值转换为对应java程序实现的smt表达式;
[0022]
s6:对s4中产生的java程序规约的smt表达式和s5中产生的java程序实现的smt表达式的精化关系进行求解,若存在精化关系,则说明通过形式化验证,否则生成对应用的反
例用说明,得到验证结果;
[0023]
s7:接受验证结果,生成形式化验证结果报告。
[0024]
作为进一步地改进,本发明所述的步骤s3中的java程序规约包括java程序的表达不变式、安全性。
[0025]
作为进一步地改进,本发明所述的步骤s1中,词法分析具体为收java程序源代码,根据预定义地java语言文法规则,将输入java源代码字符串进行扫描和分析,转换为对应词素,并输出一个词法单元序列;所述的语法分析具体为:获得词法单元序列,并验证这个序列可以由源语言的文法生成,将词法单元序列中的词素生成抽象语法树;所述的语义分析具体为:接受抽象语法树,收集标识符的属性信息并对抽象语法树进行语义检查,同时输出一颗抽象语法树。
[0026]
作为进一步地改进,本发明所述的步骤s3中的对java程序需求文档进行自动化建模的建模方法是根据所述软件需求文档生成并输出验证所需的java程序规约。
[0027]
作为进一步地改进,本发明所述的步骤s4中的java程序规约需要使用符号执行的方法转换为smt表达式。
[0028]
作为进一步地改进,本发明所述的步骤s5中的java程序实现需要使用符号执行的方法转换为smt表达式。
[0029]
作为进一步地改进,本发明所述的步骤s7中的形式化验证结果报告包括错误数量、成功数量、错误信息详细说明、错误代码位置和验证方法名。
[0030]
本发明还公开了一种用于java软件的形式化验证装置,包括:
[0031]
java语言编译器:用于获得java程序源代码,并对java程序源代码进行词法分析、语法分析和语义分析,生成java扩展抽象语法树;
[0032]
语法树解析器:用于解析出java扩展抽象语法树中的常量、变量、继承关系和函数限定符,为其分配内存地址,生成中间表示代码;
[0033]
文档建模器:用于对java程序需求文档进行自动化建模,翻译成对应的java形式化规约,其中,形式化规约主要包括java程序的表达不变式、安全性;
[0034]
java程序规约解析器:用于解析java程序规约,将形式化人员定义的java程序规约转换成对应的java程序规约的smt表达式;
[0035]
中间语言解释器:用于解析步骤s3中的中间表示代码的指令含义,根据指令含义将代码转换为符号值,根据符号值转换为对应java程序实现的smt表达式;
[0036]
smt求解器:用于对s4中产生的java程序规约的smt表达式和s5中产生的java程序实现的smt表达式的精化关系进行求解,若存在精化关系,则说明通过形式化验证,否则生成对应用的反例用说明,得到验证结果;
[0037]
java程序漏洞检测文档生成器:用于接受验证结果,生成形式化验证结果报告。
[0038]
本发明的有益效果如下:
[0039]
1)将java代码转换为一种中间表示语言,并对该中间表示语言进行建模,再由相关形式化验证人员根据不同模型的功能需求文档描述程序规约并证明。由于中间语言的语义较为简单,有较少的未定义行为,因此本发明基于中间语言的形式化验证,通过将java代码转换为中间表示代码,避免了形式化验证系统需要对复杂的java语言模型进行建模和验证,降低了对于java语言的形式化验证的难度,也减少了对于形式化验证人员的个人素质
依赖。
[0040]
2)通过基于smt求解器的形式化验证方式,提高了形式化验证的自动化程度,降低了形式化验证的数学难度和形式化验证的门槛;
[0041]
3)针对引入了无界循环代码的处理,可以有限制地编码为约束,通过使用循环不变式或有限展开循环,可以有限制地将循环编码为约束。
附图说明
[0042]
图1为本发明一种实施例公开的java自动形式化建模检测验证方法流程图;
[0043]
图2为本发明一种实施例公开的实现java自动形式化建模检测验证方法的装置示意图;
具体实施方式
[0044]
为使本发明实施的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0045]
下面结合附图对本发明做进一步的详细描述:图1为本发明一种实施例公开的java自动形式化建模检测验证方法流程图;
[0046]
步骤s1:对java程序源代码进行词法分析、语法分析和语义分析,生成java扩展抽象语法树;
[0047]
步骤s2:借助步骤s1中生成的java抽象语法树,解析出java抽象语法树中的常量、变量、继承关系和函数限定符,为其分配内存地址,生成中间语言表示代码;其中,中间语言表示代码在实施例中是llvm ir。
[0048]
步骤s3:对java程序需求文档进行自动化建模,翻译成对应的java形式化规约,
[0049]
其中,java程序需求文档的格式是键值对的xml格式,具体需要包括需求描述的方法名“functionname”及其键值、方法参数“functionparameter”及其键值、前条件“precondition”及其键值、后条件“postcondition”及其键值、循环不变式“invariant”及其键值。
[0050]
其中,形式化规约主要包括java程序的表达不变式、安全性。在实施例中,形式化规约为使用rosette编写的java程序的不变式和安全性规约,常见的安全性定义比如不干涉属性,其形式化规约用如下方法描述:
[0051][0052]
步骤s4:借助步骤s2中生成的中间语言表示代码,并且使用符号执行和smt求解器支持的编程语言为步骤s2所述中间代码表示编写解释器,通过符号执行在中间语言上探索java程序的可达运行状态,并将java程序从中间语言转换为对应的smt表达式,并且输出至smt求解器。
[0053]
其中,smt求解器支持的编程语言在实施例中为rosette。
[0054]
中间语言解释器在实施例中为使用rosette编写的llvm ir解释器,其中部分llvm ir解释器如下所示:
[0055][0056]
步骤s5:借助步骤s3中产生的java程序规约的smt表达式和步骤s4中产生的java程序实现的smt表达式,输入到smt求解器对二者的表达式的精化关系进行求解,如果存在精化关系,则说明通过形式化验证,否则生成对应用的反例用于后续java程序漏洞检测文档生成器的生成。
[0057]
其中,smt求解器在实施例中为z3求解器。
[0058]
步骤s6:借助步骤s5中生成的验证结果,生成对应的形式化验证结果报告。
[0059]
图2为本发明一种实施例公开的实现java自动形式化建模检测验证方法的装置示意图;包括:java语言编译器、语法树解析器、中间语言解释器、文档建模器、java程序规约解析器、smt求解器和java程序漏洞检测文档生成器。
[0060]
java语言编译器用于接收java程序源代码,将java程序源代码编译得到扩展抽象语法树,再将扩展抽象语法树通过预定义的pass转换为标准的java抽象语法树,最后将抽象语法树输入到语法树解析器中进行解析。
[0061]
语法树解析器用于接收java语言编译器生成的标准java抽象语法树,并解析出代码中的常量、变量、继承关系、函数限定符,为其分配内存地址,生成中间表示代码并输出到中间语言解析器中。
[0062]
中间语言解释器用于接收语法树解析器生成的中间语言,解析中间语言的指令含义,根据指令的含义将代码转换为符号值,根据符号值转换为相应的smt表达式,并输入到smt求解器中求解。
[0063]
文档建模器:用于对java程序需求文档进行自动化建模,翻译成对应的java形式化规约,其中,形式化规约主要包括java程序的表达不变式、安全性;
[0064]
java程序规约解析器用于解析java程序规约,java程序规约解析器将形式化人员定义的java程序规约转换成对应的smt表达式,用于后续输入到smt求解器中进行精化关系的验证求解。
[0065]
smt求解器用于接收java程序规约生成的smt表达式和中间语言生成的smt表达式,并对两者的精化关系进行证明,如果精化关系不成立则生成一组反例用以说明,并将证明结果输出至java程序漏洞检测文档生成器。
[0066]
java程序漏洞检测文档生成器用于接收smt求解器输出的验证结果,并生成java程序漏洞检测文档。
[0067]
以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献