一种基于指令脆弱性分析的SDC错误检测方法与流程

文档序号:15346852发布日期:2018-09-04 22:51阅读:357来源:国知局

本发明属于软加固和可信软件领域,具体涉及基于指令脆弱性分析的sdc错误检测方法。



背景技术:

随着集成电路技术的发展,在计算机性能大幅度提升的同时芯片也更容易受到空间辐射的影响。在太空环境中,由高能粒子辐照或电磁脉冲干扰等因素造成的单粒子效应是计算机系统失效的主要原因之一。单粒子翻转(singleeventupset,seu)是单粒子效应最主要的表现形式。由单粒子翻转造成的系统硬件故障称为软错误,是一种瞬时故障。软错误对系统可靠性的影响在于它会传播到程序中,造成程序的状态异常或功能失效。在星载计算机的研究领域中,已出现过多次单粒子翻转事件,造成计算机功能出现严重损伤。

瞬时故障对程序运行的影响有很多种:虽然发生了瞬时故障,但没有影响程序的正常运行及结果;由于访问越界等原因导致的程序崩溃或挂起,已有基于症状的检测方法对其进行检测,并使用检查点机制进行恢复;程序能够正常运行,但出现了结果错误,称为sdc(silentdatacorruption)错误。sdc错误是隐蔽传播的,由于隐蔽传播在程序的执行过程中不会有系统错误的提示,因而无法被检测机制捕获,但却会导致程序产生错误的结果。

在基于软件的数据流错误检测方法中,目前针对程序sdc错误检测的方法主要有两种:程序冗余和程序断言。马骏驰等人在源代码中插入以不变量为内容的断言,利用发生软错误后断言报错来检测软错误,具有较高的检出率和较低的检测代价。laguna等人针对瞬时故障下科学计算程序中soc(silentoutputcorruption)错误,采用支持向量模型对程序中的soc脆弱指令进行判定,并对其进行冗余保护,他们的方法极大的降低了错误检测的性能开销。但该方法针对的是科学计算程序,普适性不够好。lu等人基于决策回归树对程序中的存储指令和比较指令进行脆弱性预测,通过程序分析的方法得出程序中所有指令的sdc脆弱性值,并基于此对程序进行冗余保护。基于程序断言的检测方法的检测代价不高,但检测率较低。而基于程序冗余的方法的研究重点在于如何分析程序中脆弱的部分并对其进行选择性的冗余处理。

随着集成电路芯片工艺尺寸的减小,软错误引起的失效问题也越来越多。为了解决空间辐射对软件执行的影响,尤其是在高可靠性的航空航天领域,要使得程序在sdc错误存在的条件下仍然可以正确的运行,首要的是必须及时检测出瞬时故障导致的程序sdc错误。已有研究表明,sdc错误是由相对较小比例的指令中的数据变量错误引起的,因此如可以事先找到软件中的脆弱点并选择性的保护这些变量,则可实现高效费比的sdc错误检测机制以及目标程序加固机制。有技术中尚无一种利用支持向量回归进行指令sdc脆弱性分析并对sdc错误进行检测的报道。



技术实现要素:

本发明所解决的技术问题在于提供一种基于指令脆弱性分析的sdc错误检测方法,可应用于对恶劣环境下受到瞬时故障影响的程序进行sdc错误检测。

实现本发明目的的技术解决方案为:基于指令脆弱性分析的sdc错误检测方法,包括如下步骤:

步骤1,对程序集进行故障注入实验,得到指令的sdc脆弱性值,从而构建指令sdc脆弱性分析模型样本数据集;

步骤2,根据步骤1得到的程序指令样本的sdc脆弱性值,提取指令sdc脆弱性描述特征向量f;

步骤3,根据步骤1得到的指令脆弱性值和步骤2得到的指令特征向量,训练基于支持向量回归的指令sdc脆弱性分析模型;

步骤4,使用步骤2的方法提取目标程序的指令特征向量,根据训练得到的指令sdc脆弱性分析模型对目标程序指令脆弱性值进行预测分析;

步骤5,根据步骤4分析得到的指令脆弱性值,对目标程序进行指令冗余处理;

步骤6,对步骤5得到的冗余处理后的目标程序进行故障注入实验,程序在运行时对sdc错误进行检测;

步骤7,对步骤5得到的冗余处理后的目标程序的sdc错误检测能力进行评估。

本发明与现有技术相比,其显著优点为:1)本发明使用程序分析的方法分析目标程序,能够更全面的获得影响指令脆弱性的特征,从而提高指令sdc脆弱性分析的准确性;2)本发明基于支持向量回归模型分析指令sdc脆弱性,并对程序进行冗余保护,在保证检测率的同时降低了时间开销。

下面结合附图对本发明作进一步详细描述。

附图说明

图1为本发明的一种基于指令脆弱性分析的sdc错误检测方法的流程图。

图2为本发明的一种基于指令脆弱性分析的sdc错误检测方法的框架图。

图3为sdc错误检测率比较图。

图4为性能开销比较图。

具体实施方式

结合附图,本发明的一种基于指令脆弱性分析的sdc错误检测方法,包括如下步骤:

步骤1,对程序集进行故障注入实验,得到指令的sdc脆弱性值,从而构建指令sdc脆弱性分析模型样本数据集;

所述的指令sdc脆弱性值采用下式计算:

其中,集合vstatic是程序的静态指令集合,ii表示程序中的第i条静态指令,n为程序中所有静态指令的数目;集合vdynamic是程序运行时的动态指令集合,di为指令ii的动态执行次数;集合idynamic(i)代表程序运行时静态指令ii对应的所有动态执行指令,是vdynamic的子集,为指令ii的第q条动态指令;psdc(ii)为指令ii的sdc脆弱性值,为动态指令的sdc脆弱性值,通过故障注入实验结果计算得到。

步骤2,根据步骤1得到的程序指令样本的sdc脆弱性值,提取指令sdc脆弱性描述特征向量f;

所构建的指令sdc脆弱性描述特征向量f为下列二元组:

其中,fdependent为数据传播依赖相关的指令依赖特征向量;end是一个包含五个字段的特征向量,end=<estore,ecaller,eicmp,efcmp,eaddress>,分别表示是否被存储指令、函数调用指令、整型比较指令、浮点型比较指令、地址相关指令引用,若是则将相应位标记为1,否则标记为0;cmp是一个包含两个字段的特征向量,用来表征末端指令为比较指令时相关的指令特征,cmp=<loopdepth,pbranch>,loopdepth为比较指令所在的循环深度,pbranch为静态分支概率;crash是一个包含两个字段的特征向量,用来表征与程序崩溃相关的特征;crash=<bytedest,addrnum>,bytedest为目的操作位数,addrnum为前向切片中与地址相关的指令数;mf为计算出的错误屏蔽因子;finherent为表征指令自身性质的指令固有特征向量;ic为指令的类型,是一个包含8个字段的特征向量,ic=<cint,cfloat,ccmp,cbit,cconv,cmem,ccall,cload>,分别表示是否为整型二元操作、浮点型二元操作、比较指令、逻辑操作、转换操作、地址相关的操作、函数调用指令、内存读指令,若是则将相应字段标记为1,否则标记为0;insttime为动态指令执行时间与程序总时间占比;bbl为指令所在基本块的大小;inloop表示指令是否在循环中;rinbb表示到基本块结束还需执行的指令数;dcratio表示指令与函数执行时间的比值;callnum表示指令所在函数被调用的次数;rinfun表示到函数返回还需执行的指令数;varglobal表示指令中变量是否会影响全局变量,若是则标记为1,否则标记为0;fanout表示指令目的操作数的扇出值。

步骤3,根据步骤1得到的指令脆弱性值和步骤2得到的指令特征向量,训练基于支持向量回归的指令sdc脆弱性分析模型;

训练基于支持向量回归的指令sdc脆弱性分析模型时,给定指令样本数据的训练集t={(fi,pi)},i=1,2,...,l,l为训练集中样本的数量,其中fi=<fi.inherent,fi.dependent>为训练集中的第i个样本的特征向量;pi表示第i个指令样本的sdc脆弱性;根据支持向量回归机结构化风险最小化原则,建立指令脆弱性分析模型,并进行求解,可得到相应的指令sdc脆弱性预测分析函数为:

其中,f表示待分析目标指令的特征向量;α和为求解得到的lagrange乘子;k(fi,f)表示根据svr理论引入的核函数;b为求解得到的偏置项。

步骤4,使用步骤2的方法提取目标程序的指令特征向量,根据步骤3中训练得到的指令sdc脆弱性分析模型对目标程序指令脆弱性值进行预测分析;

步骤5,根据步骤4预测分析得到的指令脆弱性值,对目标程序进行指令冗余处理;所述的指令冗余的方法具体包含三个步骤:

步骤5.1:根据步骤4的指令sdc脆弱性预测分析函数分析得到指令脆弱性值,在程序中采用下式选择待冗余的指令集合:

其中,isort表示对指令脆弱性按递减顺序进行排序后的指令集合;为指令的sdc脆弱性值,为指令的动态指令数;iselected表示从排序后指令isort中选出的前s条指令集合;z表示对指令的冗余粒度,即对目标程序进行冗余处理的指令比例;d是程序中静态指令的总数目;

步骤5.2:对步骤5.1中的指令集合iselected进行冗余处理得到集合遍历idup中所有指令,若指令数据依赖于且i>j,则他们存在定义引用关系;若idup指令集合中的指令不能和其他的冗余指令构成定义引用关系,则在步骤5.3中为该冗余指令添加单独的比较指令;

步骤5.3:在基本块的最后插入比较指令,比较原始指令的执行结果和插入的冗余指令的执行结果,若结果不一致,则表明出现了瞬时故障,需要采取措施进行恢复;若结果一致,则表明该段基本块代码的执行没有出现错误。

步骤6,对步骤5得到的冗余处理后的目标程序进行故障注入实验,程序在运行时对sdc错误进行检测;

步骤7,对步骤5得到的冗余处理后的目标程序的sdc错误检测能力进行评估。所述的sdc错误检测能力通过下式进行评估:

其中,sdccoverage表示sdc错误检出率;nsdc表示原目标程序注入故障后发生sdc错误的次数;ndup表示经过冗余处理后的目标程序注入故障后检测到sdc错误的次数。

本发明给出影响指令脆弱性的指令特征,指令sdc脆弱性分析模型,对脆弱性较高的指令进行冗余处理以及对sdc错误进行检测的方法。该方法对sdc错误的检测率高,且性能开销低,可应用于恶劣环境下瞬时故障导致的程序sdc错误的检测。

下面结合实施例对本发明做进一步详细的描述。

实施例

结合图1和图2,本发明是一种基于指令脆弱性分析的sdc错误检测方法。包括如下步骤:

步骤1、对mibench程序集中的fft(傅里叶变换)、basicmath(数学计算)、sha(安全散列算法)、crc(通信crc32计算工具)、partricia(网络中用于叶子稀疏的树结构)、sphinx(语音解码)六个程序进行故障注入实验,得到指令的sdc脆弱性值,从而构建指令sdc脆弱性预测模型样本数据集,包括4365个指令样本。所述的指令的sdc脆弱性值采用如下公式:

其中,集合vstatic是程序的静态指令集合,ii表示程序中的第i条静态指令,n为程序中所有静态指令的数目;集合vdynamic是程序运行时的动态指令集合,di为指令ii的动态执行次数;集合idynamic(i)代表程序运行时静态指令ii对应的所有动态执行指令,是vdynamic的子集,为指令ii的第q条动态指令。psdc(ii)为指令ii的sdc脆弱性值,为动态指令的sdc脆弱性值,通过故障注入实验结果计算得到。

步骤2、根据步骤1得到的程序指令样本的sdc脆弱性值,提取指令sdc脆弱性描述特征向量f。所构建的指令特征向量f为下列二元组:

其中,fdependent为数据传播依赖相关的指令依赖特征向量;end是一个包含五个字段的特征向量,end=<estore,ecaller,eicmp,efcmp,eaddress>,分别表示是否被存储指令、函数调用指令、整型比较指令、浮点型比较指令、地址相关指令引用,若是则将相应位标记为1,否则标记为0;cmp是一个包含两个字段的特征向量,用来表征末端指令为比较指令时相关的指令特征,cmp=<loopdepth,pbranch>,loopdepth为比较指令所在的循环深度,pbranch为静态分支概率;crash是一个包含两个字段的特征向量,用来表征与程序崩溃相关的特征;crash=<bytedest,addrnum>,bytedest为目的操作位数,addrnum为前向切片中与地址相关的指令数;mf为计算出的错误屏蔽因子。

finherent为表征指令自身性质的指令固有特征向量;ic为指令的类型,是一个包含8个字段的特征向量,ic=<cint,cfloat,ccmp,cbit,cconv,cmem,ccall,cload>,分别表示是否为整型二元操作、浮点型二元操作、比较指令、逻辑操作、转换操作、地址相关的操作、函数调用指令、内存读指令,若是则将相应字段标记为1,否则标记为0;insttime为动态指令执行时间与程序总时间占比;bbl为指令所在基本块的大小;inloop表示指令是否在循环中;rinbb表示到基本块结束还需执行的指令数;dcratio表示指令与函数执行时间的比值;callnum表示指令所在函数被调用的次数;rinfun表示到函数返回还需执行的指令数;varglobal表示指令中变量是否会影响全局变量,若是则标记为1,否则标记为0;fanout表示指令目的操作数的扇出值。

步骤3、根据步骤1得到的指令脆弱性值和步骤2得到的指令特征向量,训练基于支持向量回归的指令sdc脆弱性分析模型:

给定指令样本数据的训练集t={(fi,pi)},i=1,2,...,l,l为训练集中样本的数量,其中fi=<fi.inherent,fi.dependent>为训练集中的第i个样本的特征向量;pi表示第i个指令样本的sdc脆弱性。根据支持向量回归机结构化风险最小化原则,建立指令脆弱性分析模型,并进行求解,可得到相应的指令sdc脆弱性预测分析函数为:

其中,f表示待分析目标指令的特征向量;α和为求解得到的lagrange乘子;k(fi,f)表示根据svr理论引入的核函数;b为求解得到的偏置项。

步骤4、使用步骤2的方法提取qsort(快速排序)、dijkstra(最短路径算法)、susan(图像识别)三个目标程序的待分析目标指令特征向量,根据步骤3中训练得到的指令sdc脆弱性分析模型对指令脆弱性进行预测分析;

步骤5、根据步骤4预测分析得到的指令脆弱性值,对目标程序进行指令冗余。所述的指令冗余的方法具体包含三个步骤:

步骤5.1、根据步骤4预测分析得到指令脆弱性值,在程序中按照如下公式选择待冗余的指令集合:

其中,isort表示对指令脆弱性按递减顺序进行排序后的指令集合;为指令的sdc脆弱性值,为指令的动态指令数;iselected表示从排序后指令isort中选出的前s条指令集合;z表示对指令的冗余粒度,即对目标程序进行冗余处理的指令比例,取z的值为分别为0.1、0.2、0.3;d是程序中静态指令的总数目。

步骤5.2、对步骤5.1中的指令集合iselected进行冗余处理得到集合遍历idup中所有指令,若指令数据依赖于且i>j,则他们存在定义引用关系;若idup指令集合中的指令不能和其他的冗余指令构成定义引用关系,则在步骤5.3中为该冗余指令添加单独的比较指令。

步骤5.3、在基本块的最后插入比较指令,比较原始指令的执行结果和插入的冗余指令的执行结果,若结果不一致,则表明出现了瞬时故障,需要采取措施进行恢复;若结果一致,则表明该段基本块代码的执行没有出现错误。

步骤6、对步骤5得到的冗余处理后的目标程序进行故障注入实验,程序在运行时对瞬时故障导致的sdc错误进行检测。

步骤7、对步骤5得到的冗余处理后的目标程序的sdc错误检测能力进行评估。所述的sdc错误检测能力通过下式进行评估:

其中,sdccoverage表示sdc错误检出率;nsdc表示原目标程序注入故障后发生sdc错误的次数;ndup表示经过冗余处理后的目标程序注入故障后检测到sdc错误的次数。

图3给出了sdc错误检测率的比较图。其中,ml-sed-10、ml-sed-20、ml-sed-30分别对应本发明的方法中z取0.1、0.2、0.3时对目标程序进行不同粒度的指令冗余处理。hotpath是对程序中执行频繁的路径进行冗余。图4给出了性能开销比较图。

由图3和图4可知,本发明的方法可以以较低的时间开销获取较高的sdc错误检出率。

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