基于机器学习的循环不变式自动生成方法与流程

文档序号:18985613发布日期:2019-10-29 04:21阅读:599来源:国知局
基于机器学习的循环不变式自动生成方法与流程

本发明属于软件工程、自动验证、形式化方法技术领域,涉及一种循环不变式自动生成方法。



背景技术:

软件作为当今信息化社会的重要基础设施,已广泛应用于能源、交通、通信、金融和国防等安全攸关领域中。然而,随着软件集成程度的提高和软件系统结构的日益复杂,各类软件的高可信性质越来越不能保证。软件验证以逻辑和数学为基础,支持软件进行严格的形式规约和验证,是确保软件可信性的一种有效措施。软件验证的目标是证明程序在任何执行路径下均满足一定的形式化规约,即程序在确定的条件下执行结束后便可满足一定的要求。软件验证的一般步骤是针对待验证的程序撰写形式化规约(如前置条件、后置条件和循环不变式),然后利用自动验证工具或交互式定理证明器验证给定程序是否满足所撰写的形式化规约。根据所使用的验证工具不同,可将形式化验证方法分为人工撰写证明脚本和自动化验证两类。人工撰写形式化证明脚本方法即验证者利用isabelle、coq和hol4等交互式定理证明器,依据待验证程序运行环境建立形式化模型,根据其满足的属性建立形式化规约,并在交互式定理证明器中完成推理验证,其证明开销较大。

为了提高验证效率、简化验证难度,出现了z3、danfy和why3等自动化验证工具。运用自动化验证工具对代码量较少的程序进行验证,无需验证者撰写大量证明脚本,仅需按照自动化验证工具的规范撰写待验证程序的形式化规约,即可快速得到程序是否正确的验证结果。然而,为程序提供合适的形式化规约,尤其是循环不变式,需要验证者依据对程序的深刻理解进行手工撰写,这对于验证者来说是一项任务繁重的工作任务且容易出现错误。



技术实现要素:

本发明所要解决的问题是提供一种基于机器学习的方法实现面向可运行的计算机程序的自动生成循环不变式,以克服自动验证过程需要手工撰写循环不变式的困难,缩短验证周期和避免手工撰写循环不变式出现的错误问题。

为此目的,本发明提供的基于机器学习自动生成循环不变式的方法,包括以下步骤,

步骤一,对含循环语句的计算机程序,如c程序,依据所设计的自动生成后置条件的算法得到循环语句的后置条件,构造计算机程序中循环语句对应的hoare三元组;

步骤二,依据循环语句的前置条件随机生成测试数据,以这些测试数据为循环变量的初始值运行循环语句,收集程序状态,从而构造数据集sv;

步骤三,对数据集sv中的每一组数据,依据hoare三元组所定义的关系进行分类标注形成分类数据集;

步骤四,利用所设计的核支持向量机ksvm(kernelsupportvectormachine)算法对所收集的分类数据集进行分类,从而生成候选循环不变式;

步骤五,利用反证法对生成的候选不变式进行有效性验证,得到经验证的有效循环不变式。

进一步,上述步骤一中,其目标是实现对程序中循环语句后置条件的自动生成,所述含循环语句的程序是具有前置条件、单层循环且循环变量是可归纳类型,以便通过边界值分析法计算出循环次数并结合前置条件生成后置条件。

步骤二中,所述的依据循环语句的前置条件随机生成测试数据是通过随机方式生成满足前置条件的数据集sp和不满足前置条件的数据集sn,两种方式构造测试数据集sv=sp∪sn。

所述的程序状态是程序中每个变量名到变量值的映射集合,将所有的程序状态作为测试数据集sv,依据循环条件执行有限次循环语句,并记录每一次循环结束后程序状态,组成数据集sc,并将数据集sc加入到数据集sv中,即sv=sp∪sn∪sc。

步骤三中,所述分类标注是指依据循环不变式与hoare三元组中所定义的前置条件、后置条件和循环体的关系,将步骤二所定义的数据集sv标注为:错误的数据、一定满足循环不变式的数据、一定不满足循环不变式的数据和不确定的数据。

步骤四中,所述的核支持向量机ksvm算法是一种由径向基核函数和线性核函数复合而成的多核函数,以使得线性不可分的数据能够在高维空间进行有效划分。所述候选不变式是能够明确划分步骤三所标注的一定满足循环不变式的数据和一定不满足循环不变式的数据的分类器。

步骤五中,所述有效性验证是对候选不变式取反,判断前置条件或后置条件是否存在存在满足候选不变式范围之外的数据,如果有则为无效候选不变式,否则为有效循环不变式。

与现有技术相比,本发明的有益效果:

1,本发明提供的基于机器学习自动生成循环不变式的方法实现了面向可运行的计算机程序的自动生成循环不变式,且支持生成提供形式更加丰富的循环不变式,包含析取和合取这两种谓词逻辑关系的多项式不等式,能够大大减少形式化验证中循环语句自动验证的工作量。

2,本发明同时还复合现有的核函数构造了一种多核函数,使得线性不可分的数据能够在高维空间可分,以提高循环不变式生成效率。

附图说明

图1为本发明所述基于机器学习生成循环不变式的处理流程图。

具体实施方式

下面结合附图对本发明进行详细说明。

本发明所述使用核支持向量机ksvm作为一种“黑箱”来自动生成循环不变式的过程如图1所示,整个过程共分为三个阶段。

第一个阶段是预处理,目标是实现对程序中循环语句后置条件的自动生成,并将前置条件、循环语句和后置条件组成hoare三元组(文件命名为*.cfg)。

第二个阶段是迭代生成候选不变式,首先依据循环语句的前置条件随机生成测试数据,以这些测试数据作为循环变量的初始值运行循环语句,并收集循环语句执行过程中循环变量的值,组成样本数据集sv,对数据集sv依据所生成的hoare三元组判定sv中的每一个数据s是否属于循环不变式的范围进行标注,然后使用ksvm对数据集sv进行分类并生成候选不变式。为了减少迭代次数,在候选不变式的边界线上选择有限个样本数据加入到sv训练候选不变式直到其不再发生变化为止。最后,运用smt求解器验证候选不变式是否存在不满足霍尔逻辑的反例数据。若存在反例数据,则将其加入到sv继续进行下一次迭代直到产生一个循环不变式为止。其中数据集sv的收集有两种方法:一种是依据每个变量的定义域随机生成有限个变量。另一种是利用smt求解器生成满足前置条件p和不满足前置条件p的一些数据。

第三个阶段是验证所求得的循环不变式是否符合hoare规则的(1)、(2)和(3)三个条件,输出结果为有效循环不变式或无效循环不变式。

p→i(1)

i∧c→bodyi(v)∧i(2)

现对基于机器学习自动生成循环不变式所涉及的算法做一简要的介绍。

1.自动生成后置条件算法

本发明中所使用的符号界定:符号c表示循环条件,符号b表示循环体,符号v={v1,v2,v3……vn}表示与循环语句相关的变量集合,符号bodyi(v)={v1–>xi,v2->yi,……vn->mi}表示执行第i次循环后v中各个变量的值,符号p表示循环语句的前置条件,即在执行某条程序语句前所需要满足的公式集合;符号q表示循环语句的后置条件,即在执行某条语句后应该要满足的公式集合。

第一步,依据循环的前置条件p、循环条件c和循环体b中所出现的变量构造变量集合v。

第二步,计算执行一次循环后,变量集合v中各个变量的增量δ(v)。假设执行第i次循环后变量v的值为vi,执行第i+1次循环后变量的值为vi+1,则δ(v)=vi+1-vi。

第三步,使用边界值分析法计算循环执行次数k。假定给定的循环语句在开始执行前循环变量的值满足前置条件p和循环条件c,当执行k次后终止,则表示该循环语句在k次执行之后循环变量的值不满足循环条件c。因此,在循环语句执行k-1次后,变量v的值vk-1满足循环条件c,在执行k次循环后,变量的值vk不满足的循环条件,从这两条件中计算出循环的执行次数k。

第四步,依据第二步和第三步计算的结果合成公式集合。

最后,对第四步得到的公式集合进行简化得到后置条件q。

2.循环不变式的自动生成算法

第一步,构造循环执行之前变量的测试数据。首先,通过随机方式生成满足前置条件的数据集sp和不满足前置条件的数据集sn,两种方式构造测试数据集sv=sp∪sn。

第二步,以测试数据集sv作为循环语句的初始值,依据循环条件执行有限次循环语句,并记录每一次循环结束后循环变量的值,组成数据集sc,并将数据集sc加入到数据集sv中,即sv=sp∪sn∪sc。

第三步,依据数据集sv中的一个数据s是否满足循环不变式的方法,将sv划分为ce(sv)、pe(sv)、ne(sv)和np(sv)四种分类集。

ce(sv)包含数据集sv中不能通过hoare逻辑验证程序的数据。公式1表示数据集sv中一个数据点s属于集合ce(sv)的条件为:存在数据点s0和s’,s0满足循环前置条件p,执行一次或多次循环体语句b后经过中间某个状态s转换得到s’,但s’不能满足后置条件q。如果集合ce(sv)非空则表示hoare三元组不能被验证。

pe(sv)包含数据集sv属于数据集sv+,即一定满足循环不变式。公式2表示数据集sv中一个数据点s属于集合pe(sv)的条件为:存在数据点s0和s’,s0满足循环前置条件p,执行一次或多次循环体语句b后经过s得到s’,s’不满足循环条件而终止且s’满足后置条件q。

ne(sv)包含数据集sv属于数据集sv-,即一定满足循环不变式。公式3表示表示数据集sv中一个数据点s属于ne(sv)的条件为:存在数据点s0和s’,s0不满足循环前置条件p时,执行一次或多次循环体语句b后经过s得到s’,s’不满足循环条件而终止且s’不满足后置条件q。

np(sv)=sv-ce(sv)-pe(sv)-ne(sv)(公式4)

第四步,运用所设计核支持向量机对数据集sv进行分类得到一个候选不变式caninv,具体生成步骤如下:

(1)利用所设计多核函数的支持向量机对数据集sv进行分类,生成一个分类器,将它作为初始候选不变式caninv;

(2)通过选择样本方法提炼候选不变式caninv;

(3)合成合取式候选不变式。

其中多核函数的支持向量机是由径向基核函数rbf和线性核函数linear复合而成的多核函数,其公式为:

kernel=0.5*rbf+0.5*linear(公式5)

第五步,利用公式6候选不变式caninv是否为有效循环不变式,如果公式6中任意一个公式为真,将会产生一个反例数据,然后再将该反例数据加入到数据集sv中,继续迭代调用ksvm进行分类,直到没有反例为止。如果不满足公式(6)任何一个,则候选不变式为有效循环不变式。

为了便于本领域的普通技术人员实施本发明,现对本发明的实施做如下的说明。

使用本发明所提供的方法能够为带循环语句的计算机程序(如c程序)生成有效的循环不变式,要求程序由前置条件和循环语句组成,且属于单层循环以及循环条件是可归纳的。使用时,如果是带分支的循环,对其生成循环不变式的过程是:首先按照路径分析方法将循环分成多条路径,再对每条路径按照上述使用核支持向量机的方法生成不变式,最后将各个循环不变式组成循环不变式的析取式。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1