一种C语言程序验证器的浮点计算精度分析方法及系统技术方案

技术编号:35904800 阅读:16 留言:0更新日期:2022-12-10 10:42
本发明专利技术公开了一种C语言程序验证器的浮点计算精度分析方法及系统,该方法包括:针对待进行形式验证的C语言程序,以注释形式生成浮点精度验证标注信息;基于携带浮点精度验证标注信息的C语言程序,进行标注解析,生成抽象语法树;基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,生成浮点精度缺陷检查和浮点精度约束检查的验证条件,调用SMT求解器进行求解证明。本发明专利技术有效提高浮点计算的分析精度和增强验证工具可用性。点计算的分析精度和增强验证工具可用性。点计算的分析精度和增强验证工具可用性。

【技术实现步骤摘要】
一种C语言程序验证器的浮点计算精度分析方法及系统


[0001]本专利技术涉及计算机软件验证
,具体涉及一种C语言程序验证器的浮点计算精度分析方法及系统。

技术介绍

[0002]随着计算机的应用日益广泛和深入,计算机软件作为计算机的灵魂和应用的载体,承担着越来越重要的功能。软件的可信性已成为现代软件质量问题的焦点。计算机程序在进行浮点计算时会产生误差,并且误差会在之后的浮点计算中累计,致使程序最终的结果与预计的实数值相比产生偏移,严重影响计算解的准确性,致使软件的可信性遭到打击。
[0003]现有技术中浮点计算部分进行验证的2种技术分别为:Gappa:Gappa采用区间算法可以对浮点表达式的精度进行相应的计算,并给出证明。PRECiSA:PRECiSA通过静态分析对程序进行舍入误差验证,是一种自动分析工具,用于估计浮点表达式的舍入误差。
[0004]但是,Gappa不能直接对C程序进行验证,只能作为其他验证工具的底层浮点分析工具,要使用Gappa证明C语言程序,还需要其他验证平台及工具的支持。另外,在目前版本(v

3.1.0)中,PRECiSA只接受原型验证系统(PVS)语言的子集,包括LET表达式,IF

THEN

ELSE构造,非递归函数调用以及浮点运算,不支持直接对C语言浮点程序的验证。

技术实现思路

[0005]针对上述现有技术存在的问题,本专利技术提供了一种C语言程序验证器的浮点计算精度分析方法及系统,有效提高浮点计算的分析精度和增强验证工具可用性。
[0006]第一方面,本申请提供了一种用于C语言程序验证器的浮点计算精度分析方法,包括如下步骤:
[0007]针对待进行形式验证的C语言程序,以注释形式生成浮点精度验证标注信息;
[0008]基于携带浮点精度验证标注信息的C语言程序,进行标注解析,生成抽象语法树;
[0009]基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,生成浮点精度缺陷检查和浮点精度约束检查的验证条件,调用SMT求解器进行求解证明。
[0010]在一种实施方式中,所述以注释形式生成浮点精度验证标注信息,包括:
[0011]在C程序函数的声明或者定义之前生成函数协议标注,包括函数协议前件(requires)子句和函数协议后件(ensures)子句,所述requires子句用于表征函数被调用时,程序变量必须满足的浮点精度约束,所述ensures子句用于表征函数执行结束后,程序变量所满足的浮点精度约束;
[0012]在C程序的语句之间的语句标注,包括:
[0013]a.循环次数标注:loop max_unroll UNROLL_NUM;
[0014]b.二分控制精度标注:check_limits“结果区间约束谓词”;
[0015]c.浮点精度约束内置谓词,包括:
[0016]用于描述变量x的实数取值区间的内置谓词\real_range(x,a,b)、用于描述变量x
的误差取值区间的内置谓词\error_range(x,a,b)、用于描述程序点的舍入模式的内置谓词\roundingmode(m),其中x为程序变量,a,b为实数常量,m为舍入模式标签。
[0017]在一种实施方式中,所述基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,包括:通过运算法则对区间形式的参数进行运算,得到区间形式的运算结果,记第一个区间为第二个区间为则第一个区间和第二个区间经过运算法则运算后得到的区间为:
[0018]若为有理数,则:
[0019]加法运算:
[0020]减法运算:
[0021]乘法运算:
[0022]除法运算:基于乘法运算计算;
[0023]若为浮点数,为向下舍入Δ为向上舍入,则:
[0024]加法运算:
[0025]减法运算:
[0026]乘法运算:乘法运算:
[0027]除法运算:基于乘法运算计算。
[0028]在一种实施方式中,所述基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,包括:对于乘法运算,采用优化后的乘法运算法则对区间形式的参数进行运算,得到区间形式的运算结果,所述优化后的乘法运算法则包括:
[0029](301)记第一个区间为第二个区间为基于第一个区间和第二个区间的上界和下界值与0的大小关系对第一个区间和第二个区间划分为多种类型;
[0030](302)基于乘法运算中第一个区间的所属类型和第二个区间的所属类型组合结果类型对乘法运算结果的区间的上界值和下界值的4个候选值排除至少一个确定的非最小值的候选值,对乘法运算结果的区间下界值的4个候选值排除至少一个确定的非最大值的候选值,基于余下的下界值候选值、上界值候选值作为乘法运算优化后的运算结果区间。
[0031]在一种实施方式中,所述(301)基于第一个区间和第二个区间的上界和下界值与0的大小关系对第一个区间和第二个区间划分为多种类型,包括:
[0032]对第一个区间划分为三个类型:u>=0、u<=0;
[0033]对第二个区间划分为三个类型:v>=0、
[0034]所述(302)包括:
[0035](3021)若为有理数:则上界值和下界值的4个候选值为为有理数:则上界值和下界值的4个候选值为对应的,优化后的乘法运算法则包括:
[0036]当u>=0,v>=0时:(u*v).inf=u*v,
[0037]当u>=0,时:
[0038]当u>=0,时:
[0039]当v>=0时:
[0040]当时:
[0041]当时:(u*v).sup=u*v;
[0042]当v>=0时:
[0043]当时:(u*v).sup=u*v;
[0044]当时:(u*v).sup=u*v;
[0045](3022)若为浮点数:则上界值的4个候选值为Δ(u*v),为浮点数:则上界值的4个候选值为Δ(u*v),下界值的4个候选值为下界值的4个候选值为下界值的4个候选值为为向下舍入,Δ为向上舍入,对应的,优化后的乘法运算法则包括:
[0046]当u>=0,v>=0时:
[0047]当u>=0,时:
[0048]当u>=0,时:
[0049]当v>=0时:
[0050]当时:时:
[0051]当时:(u*v).sup=Δu*v;
[0052]当v>=0时:
[0053]当时:(u*v).sup=Δu*v;
[0054]当时:(u*v).sup=Δu*v。
本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,包括:针对待进行形式验证的C语言程序,以注释形式生成浮点精度验证标注信息;基于携带浮点精度验证标注信息的C语言程序,进行标注解析,生成抽象语法树;基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,生成浮点精度缺陷检查和浮点精度约束检查的验证条件,调用SMT求解器进行求解证明。2.根据权利要求1所述的一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,所述以注释形式生成浮点精度验证标注信息,包括:在C程序函数的声明或者定义之前生成函数协议标注,包括函数协议前件(requires)子句和函数协议后件(ensures)子句,所述requires子句用于表征函数被调用时,程序变量必须满足的浮点精度约束,所述ensures子句用于表征函数执行结束后,程序变量所满足的浮点精度约束;在C程序的语句之间的语句标注,包括:a.循环次数标注:loop max_unroll UNROLL_NUM;b.二分控制精度标注:check_limits“结果区间约束谓词”;c.浮点精度约束内置谓词,包括:用于描述变量x的实数取值区间的内置谓词\real_range(x,a,b)、用于描述变量x的误差取值区间的内置谓词\error_range(x,a,b)、用于描述程序点的舍入模式的内置谓词\roundingmode(m),其中x为程序变量,a,b为实数常量,m为舍入模式标签。3.根据权利要求1所述的一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,所述基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,包括:对于乘法运算,采用优化后的乘法运算法则对区间形式的参数进行运算,得到区间形式的运算结果,所述优化后的乘法运算法则包括:(301)记第一个区间为u:第二个区间为v:基于第一个区间和第二个区间的上界和下界值与0的大小关系对第一个区间和第二个区间划分为多种类型;(302)基于乘法运算中第一个区间的所属类型和第二个区间的所属类型组合结果类型对乘法运算结果的区间的上界值和下界值的4个候选值排除至少一个确定的非最小值的候选值,对乘法运算结果的区间下界值的4个候选值排除至少一个确定的非最大值的候选值,基于余下的下界值候选值、上界值候选值作为乘法运算优化后的运算结果区间。4.根据权利要求3所述的一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,所述(301),包括:对第一个区间划分为三个类型:u>=0、对第二个区间划分为三个类型:v>=0、所述(302)包括:(3021)若u,v,为有理数,则上界值和下界值的4个候选值为u*v,为有理数,则上界值和下界值的4个候选值为u*v,对应的乘法运算优化后的运算结果区间为:
(3022)若u,v,为浮点数,则上界值的4个候选值为Δ(u*v),为浮点数,则上界值的4个候选值为Δ(u*v),下界值的4个候选值为下界值的4个候选值为下界值的4个候选值为为向下舍入,Δ为向上舍入,对应的乘法运算优化后的运算结果区间为:下舍入,Δ为向上舍入,对应的乘法运算优化后的运算结果区间为:5.根据权利要求1所述的一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,所述基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,包括:对于除法运算u/v的演算采用如下步骤:(501)基于v的区间确定1/v的区间上界值和下界值;(502)基于u的区间信息和1/v的区间的区间信息以乘法运算u*(1/v)的形式进行计算;所述(501)基于v的区间确定1/v的区间上界值和下界值,包括:若v,为有理数:在v>0或者时,1/v的区间上界值(1/v).sup=1/v,1/v的区间下界值时,1/v的区间上界值(1/v).sup=1/v,1/v的区间下界值在时,1/v的区间为[

∞,∞];若v,为浮点数:在v>0或者时,1/v的区间上界值(1/v).sup=Δ1/v,1/v的区间下界值时,1/v的区间上界值(1/v).sup=Δ1/v,1/v的区间下界值在时,1/v的区间为[

∞,∞]。6.根据权利要求1所述的一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,所述基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,包括:
判断参数是否存在依赖效应,若是,则对运算公式中的参数的原始区间采用区间二分策略进行细分获取对应的多个子区间;基于原始区间的多个子区间,通过运算法则对区间形式的参数进行运算,得到区间形式的运算结果;其中,所述判断参数是否存在依赖效应,包括:将表达式中多次出现的变量的区间一次二分后进行计算,将得到的结果区间与未二分处理计算的区间比较,如果结果区间有减小的变化则确定变量存在依赖效应,启用二分策略,否则,不启用二分策略。7.根据权利要求6所述的一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,所述区间二分策略包括对二分处理深度的控制方法,所述对二分处理深度的控制方法,包括:基于check_limits标注数据或者二分深度默认值MAX_BISECTION_TIMES控制二分处理深度,所述check_limits标注数据的优先级大于二分深度默认值;所述check_limits标注数据形式为:/*@check_limits\real_range(z,a,b);*/,表示二分结果需满足约束条件z的实数范围大于等于a,小于等于b;若约束条件满足,则二分处理停止,否则,继续二分处理;所述基于二分深度默认值MAX_BISECTION_TIMES控制二分处理深度,包括:当表达式中有单个变量存在依赖效应,则基于二分深度默认值MAX_BISECTION_TIMES控制所述变量的区间二分处理深度;当表达式中有多个变量存在依赖效应,则基于二分深度默认值MAX_BISECTION_TIMES/n同步控制多个变量的区间二分处理深度,其中n为存在依赖效应的变量数,结果向上取整。8.根据权利要求1所述的一种用于C语言程序验证器的浮点计算精度分析方法,其特征在于,所述基于抽象语法树进行逐语句演算,得到每一个程序点的程序变量的区间信息,包括:通过运算法则对区间形式的参数进行运算,同时基于ulp理论考虑误差累计,得到考虑误差累计的运算结果,记第一个数f
x

【专利技术属性】
技术研发人员:张祎方涛王立东杜准
申请(专利权)人:安徽中科国创高可信软件有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1