张倩雯,庄 毅
(南京航空航天大学 计算机科学与技术学院,南京 211106) E-mail:zy16@nuaa.edu.cn
随着半导体制造技术的不断发展,处理器不断缩减集成电路的尺寸、降低工作的电压.在计算机性能大幅度提升的同时使得芯片更容易受到空间辐射的影响.在太空等辐射环境中,由高能粒子辐照或电磁干扰等造成的单粒子效应是计算机系统失效的主要原因,单粒子翻转(Single Event Upset,SEU)是单粒子效应最主要的表现形式.SEU是指高能粒子轰击器件使其逻辑状态发生翻转,使得存储值的某一位由1变为0或由0变为1,可以通过重新写入逻辑值恢复其状态,这种由单粒子翻转造成的系统硬件故障称为软错误[1],是一种瞬时故障.
软错误对系统可靠性的影响在于它会传播到程序中,造成程序的状态异常或功能失效.瞬时故障对程序运行的影响大致可分为3种:
1)没有影响程序的正常运行及结果(Benign);
2)导致程序崩溃(Crash)或挂起(Hang);
3)程序正常运行,但出现了结果错误,称为SDC(Silent Data Corruption)错误.
第二类错误较易被检测到,已有基于症状的检测方法[2,3]对其进行检测,并使用检查点机制进行恢复.与这类错误相比,SDC错误是隐蔽传播的.由于隐蔽传播在程序的执行过程中不会有系统错误的提示,因而无法被检测机制捕获,但却会导致程序产生错误的结果,这也是本文研究的重点.
随着工艺尺寸的减小,软错误引起的失效问题也越来越多.为了解决空间辐射对软件执行的影响,尤其是在高可靠性的航空航天领域,要使得程序在SDC错误存在的条件下仍然可以正确的运行,我们必须实现针对SDC错误的容错机制.然而,传统的基于冗余的容错方案导致较大的性能开销,因此需要设计轻量级的容错机制,这对于必须在严格的性能约束下操作的嵌入式系统尤其如此.已有研究表明,SDC错误是由相对较小比例的指令中的数据变量错误引起的[4],因此如可以事先找到软件中的脆弱点并选择性的保护这些变量,则可实现高效费比的容错机制.
本文提出了一种基于机器学习的指令SDC脆弱性分析方法.SDC脆弱性(SDC vulnerability)指的是错误发生后会导致程序SDC错误的概率.该方法针对SDC错误,结合了程序分析和机器学习方法,根据故障注入的结果在程序编译时对指令特征进行提取,训练指令SDC脆弱性预测模型.对于待分析的程序,可以在不需要故障注入的前提下预测指令的SDC脆弱性.
目前分析程序中指令SDC脆弱性的方法主要有三种:基于故障注入的SDC脆弱性分析、基于程序静态分析的SDC脆弱性分析、基于机器学习的SDC脆弱性分析.以下分类进行相关研究工作分析介绍,并阐述本文的研究动机.
故障注入方法将需要注入故障的指令信息列入注入计划表,接着依照计划表依次进行故障注入,这类方法往往代价过高,需要耗费大量的时间.现有的研究工作一般通过有选择的进行故障注入降低注入的开销.Hari等人基于控制流等价策略对故障空间进行压缩,利用指令的控制流上下文环境预测故障的结果,删除结果可能相同的故障从而减少故障注入的开销[5].Li等人在基于控制流等价策略的基础上结合了数据流分析并开发了不同静态指令间的等价性,提出了更有效的故障空间压缩方法,实现了更高效的故障删除[6].Xu等人通过指令级脆弱性分析从故障空间中删除良性故障从而达到压缩故障空间的目的[7].基于故障注入的方法具有可控性好、成本低等优势,但面临着权衡故障注入状态空间与分析精度之间关系等问题.
基于静态分析的方法通过分析程序的特征对程序的SDC脆弱性进行分析,不需要进行故障注入实验.杨学军等人通过建立错误流模型来进行瞬时故障在程序中传播的分析,包括错误传播的规则和定律,给出了任意数据在任意计算后程序发生SDC错误的概率,对错误的传播进行了细致的量化研究[8].Pattabiraman等人利用符号执行抽象程序中变量的错误状态,利用模型检验技术抽象执行,分析错误的传播路径及程序受到的影响从而识别程序中的SDC脆弱指令[9].这类基于程序静态分析的技术容易导致状态爆炸,因此很难应用于大规模程序的分析.
马骏驰等人将静态分析与故障注入相结合,根据已执行的故障注入的信息动态的推测出SDC脆弱指令,在保证了准确率的同时减低了故障注入的开销,但这种方法很难覆盖到所有与地址相关的指令,而且没有考虑指令的操作数发生软错误后导致程序SDC错误的概率性[10].
基于机器学习的SDC脆弱性分析方法通过提取程序的一系列特征来预测其脆弱性.Bronovetsky等人比较了支持向量机和神经网络这两种机器学习方法在预测程序脆弱性时的优缺点,但他们提出的方法局限于线性代数应用程序[11].Lu等人首先在程序编译时提取指令的静态特征,接着利用决策回归树对程序中的存储指令和比较指令进行脆弱性预测,最后通过程序分析的方法得出程序中所有指令的SDC脆弱性[12].
综上所述,故障注入的方法代价较高,而程序静态分析的方法也面临着空间代价和准确率之间的权衡问题.如果能在编译的中间代码阶段实现指令SDC脆弱性的分析,那么这种方法不仅灵活、可配置,还能利用编译器来分析程序,支持多种硬件平台和高级语言.本文在故障注入实验结果的基础上,训练指令脆弱性预测模型.对于待分析的程序可以在不需要故障注入的前提下直接得到其指令的SDC脆弱性,用以指导错误检测机制的部署.
瞬时故障有一定概率会引起程序的错误,如指令操作结果发生错误、访问了错误的内存空间等.SDC错误是由于错误传播到了程序的输出导致的,因此一条指令的SDC脆弱性取决于在故障发生后它是如何传播错误的.在本节中,我们对故障模型进行了假设,描述了我们的故障注入实验,最后讨论了故障注入的实验结果并利用得到的结果在下一节中以指令为研究对象进行具体的SDC脆弱性分析.
为了通过故障注入实验对错误传播进行分析,我们对故障模型做了如下的假设:
1)本文主要考虑单粒子效应单位翻转的情况,通过改变指令寄存器的一个二进制位来模拟单位翻转.考虑到真实硬件系统的软错误率[13]及单粒子翻转故障重复率小、随机性强、暂时性的特点,我们有足够的时间在下一次瞬时故障发生前对错误进行恢复.因此,和之前的工作一样,我们假设在程序的一次执行中只会有一次故障的发生[12].
2)在硬件系统中,有些存储模块固化了ECC(Error Correcting Code)进行数据效验从而实现对软错误的容错,所以在我们的研究工作中考虑处理器中的功能部件和寄存器中(如,ALU、LSU、GPR等)发生的瞬时故障问题;我们不考虑程序计数器中发生的瞬时故障,因为这类故障导致的控制流错误可以被控制流检测机制[14]捕获;同时指令操作码发生错误一般会导致程序的崩溃,因此本文只考虑指令操作数发生错误.
为了得到程序中指令的脆弱性并理解其是如何随指令的不同而变化的,我们需要进行故障注入实验.我们使用LLFI作为故障注入工具,该工具已经被验证了可用于检测程序SDC错误的准确性[15].LLFI基于LLVM编译器框架的,工作在LLVM IR(Intermediate Representative)指令层.我们通过将故障注入到程序中的任意动态指令中来模拟分析瞬时故障对程序运行的影响.LLVM的IR指令使用静态单次赋值(Static Single Assignment,SSA)方式表示,所有的变量只能被赋值一次,每一条指令都定义了唯一的变量.
以MiBench基准程序为研究对象进行故障注入实验,对造成程序SDC错误的指令即SDC脆弱指令进行统计.结果如图 1所示,对程序10000次的注入中,所有的SDC错误由平均29.44%的静态指令发生的瞬时故障造成,而90%的SDC错误仅由程序中14.82%的静态指令发生故障造成.因此,只有部分的静态指令发软错误后会导致程序最终的SDC错误,而我们的工作就是对程序中的指令进行脆弱性预测.
我们定义指令的SDC脆弱性为发生故障后会导致SDC错误的概率.如图 2所示,我们截取了MiBench基准测试程序集中的SHA程序的一行作为示例.表 1中的列出了这行代码对应的IR指令,为了指令的可读性对其寄存器名进行了重命名.
图1 SDC脆弱指令占比Fig.1 SDC-causing instructions ratio
从表1中可以看出,指令的SDC脆弱性和数据依赖关系是高度相关的.指令4和指令5中的结果变量会在地址相关的load/store指令的引用,有较大的可能造成程序的崩溃,因此具有较低的SDC脆弱性.指令2中的结果变量会在SDC脆弱性较高的指令7中被引用,但由于该指令中定义的%conv在移位操作中被引用,使其SDC脆弱性降低.
表1 示例代码的指令SDC脆弱性
Table 1 SDC vulnerability of the sample code
ID指令SDC脆弱性1%1=loadi32*%count.addr,align40.752%conv=sexti32%1toi640.63%shl=shli64%conv,30.864%2=load%struct.SHA_INFO**%sha_info.addr,align80.15%count_lo=getelementptrinbounds%struct.SHA_INFO*%2,i320,i3210.156%3=loadi64*%count_lo,align80.897%add=addi64%3,%shl0.98storei64%add,i64*%count_lo,align8—
通过故障注入实验可知,瞬时故障是否会引起最终的SDC错误是高度依赖于我们所要加固的应用程序的,因此研究高效费比的错误检测机制需要我们识别出程序中SDC脆弱性较高的指令.下一节中,我们会对影响指令脆弱性的指令特征进行提取与分析,为指令SDC脆弱性的预测提供依据.
指令的SDC脆弱性会受到多个方面的影响,为了设计针对SDC错误的指令脆弱性分析方法,本节对影响指令SDC脆弱性的指令特征进行了讨论.在研究中,我们引入了切片技术,以指令作为分析的基本单位.通过第3节中的故障注入实验的结果分析并提取了程序中影响指令脆弱性的特征.在本文的研究中,不考虑与指令脆弱性无关的特征,如模块名等,也不考虑无法在LLVM IR指令中获取的特征信息,如体系结构相关的信息.4.1节介绍了程序切片技术并给出了相关的定义.以此为基础,4.2节对故障的传播依赖进行分析,给出了指令的依赖特征.4.3节对指令的固有特征进行了提取.
在程序的执行过程中,指令的依赖关系在一定程度上能够反映该指令的SDC脆弱性,我们需要识别出程序中受到所关注指令上变量的值所影响的语句或控制谓词.本文引入了程序切片技术来实现这一目的.程序切片的概念由Mark Weiser提出,它是一种理解程序和分析程序的方法[16],在软件测试和软件调试领域应用广泛.我们在LLVM中通过依赖图PDG(Program Dependency Graph)将程序切分为切片并利用程序切片进行相关的研究从而实现对整个程序的理解.
程序依赖图是根据指令的数据依赖和控制依赖建立的有向图.其中节点集合V代表程序中的静态指令,V={I0,I1,…,IN},N为程序中指令的数目.边集合E代表指令间的依赖关系.将指令定义为六元组I=[Os,Od,SB,SF,BB,F],Os为指令I中的源操作数,Od为指令I中的目的操作数,SB为指令I的后向切片,SF为指令I的前向切片,BB为指令I所在的基本块,F为指令I所在的函数.
在程序的运行过程中,故障会通过数据的依赖关系传播到程序的其他数据中,我们称这种故障为传播引起的故障.导致SDC错误的执行过程不会抛出系统异常的信息,硬件故障通过在程序中传播导致最后程序的结果错误,因此对程序中的数据依赖关系进行分析有助于我们提取指令的依赖特征并用以指令的脆弱性分析.在分析指令脆弱性时将与数据依赖相关的指令特征称为指令的依赖特征.
一条指令的SDC脆弱性取决其结果变量在数据依赖链的传播路径和其数据依赖链末端指令的脆弱性.在LLVM IR指令中,存储指令store和转移指令br没有目的寄存器,函数调用指令call会产生一个新的栈帧,因此这些指令都会终止数据的依赖链.基于数据流的依赖关系,可将程序中的指令分为3类:
1)指令中发生的瞬时故障会传播到存储指令中;
2)指令中发生的瞬时故障传播到分支跳转操作;
3)指令中发生的瞬时故障传播到函数调用指令中.在对第二类指令研究时,由于分支跳转指令的执行取决于较比指令的结果,我们使用比较指令来分析指令的依赖脆弱因子.图 3给出了分类代码的示例,表示发生软错误的源代码和对应IR指令中故障传播的依赖关系.
4.2.1 故障传播分析
发生瞬时故障后,在指令的数据依赖链的传播路径中,影响指令脆弱性的因素主要有两个:传播过程中故障是否会被屏蔽;传播过程中故障是否会导致程序的崩溃.我们用SDC错误屏蔽概率和程序崩溃概率分别来衡量这两个因素,并基于此定义了依赖脆弱因子来衡量依赖关系对指令脆弱性的影响.
1)SDC错误屏蔽
瞬时故障在程序的传播过程中,有些指令会屏蔽错误的传播,如在x=y&0xfff0中会屏蔽y中低4位的错误传播到x,我们称这类指令为Imask.因此如果指令中的结果会在这些指令中被使用,那么它的SDC脆弱性会降低.对于任意指令Ii,我们定义Pmask(Ii)表示该指令屏蔽错误的概率,错误屏蔽指令的类型如表 2所示.其计算公式如公式(1)所示.
(1)
图3 基于依赖关系划分的指令分类Fig.3 Instruction classification based on dependencies
表2 SDC错误屏蔽指令
Table 2 SDC error masking instructions
分 类指令操作逻辑操作and、or移位操作shl、lshr转换操作trunc、fptosi
对于程序中的指令Ii,我们定义屏蔽因子MF(Mask Factor)来表征该指令的SDC脆弱性受屏蔽指令的影响,屏蔽因子越大,指令发生错误后被屏蔽的概率越小,那么它发生瞬时故障后程序发生SDC错误的可能性也就越大.其计算公式如公式(2)所示.
MF(Ii)=FSDC(Iend)×(1-Pmask(Ii,p))
(2)
其中,Pmask(Ii,p)为指令Ii发生错误后在其传播路径p上被屏蔽的概率,其计算的具体过程在算法1中给出.FSDC(Iend)用来衡量指令Ii数据依赖链末端指令Iend的SDC脆弱性.对于数据依赖链的末端指令Iend,若该指令在程序结果输出指令的后向切片中,则FSDC(Iend)为1,若不在则为0,公式如下:
(3)
2)程序崩溃
在程序执行时,与地址相关的指令发生错误后,绝大部分情况会导致程序的崩溃.由于瞬时故障造成的程序崩溃99%都是由于段错误造成的,即程序的访存空间超出了系统给这个程序的内存空间[17].在程序中,地址变量的位数越大意味着越多的位发生错误会导致程序崩溃.对地址相关的变量发生错误后导致程序崩溃的概率以变量的位数进行分类统计,如图 4(a)所示.为了衡量程序崩溃对SDC脆弱性的影响,我们提取与程序崩溃相关的特征,如后向切片中与地址相关的指令数、目的操作数的位数等.
图4 操作数位数和循环深度对脆弱性的影响Fig.4 Effect of data width and loop depth on SDC vulnerability
4.2.2 末端指令
在数据依赖链末端指令中,对于第一类和第三类指令,其存储的值是否会在比较指令或地址相关的指令中被使用会影响该指令SDC脆弱性;对于第二类指令,嵌套循环深度是影响比较指令SDC脆弱性的重要因素.循环深度与比较指令SDC脆弱性的关系图 4(b)所示,我们选取循环深度作为一个特征,若不在循环内则该值为0.
综合上面的分析,我们提取了指令的依赖特征如表 3指令依赖特征所示.图 5中的算法1给出了指令依赖特征分析的具体过程.算法首先将程序中的所有指令按照依赖关系分为三类并生成了从该指令到数据链末端指令的传播路径(第3-16步),接着基于传播路径为每个指令计算其错误屏蔽因子(第18-20步),最后根据表3遍历所有的指令提取相关的特征(第21-26步).
表3 指令依赖特征
Table 3 Instruction dependence features
类 别特 征 名存储指令相关is_used_in_store函数调用指令相关is_used_in_call比较指令相关is_used_in_icmpis_used_in_fcmpis_used_in_zero_cmploop_depth程序崩溃相关is_used_in_addraddr_ins_numbytes_in_dest_operand错误屏蔽相关mask_factor
指令的固有特征是用来表征指令本身的性质的.在程序的执行过程中,指令的属性、指令所在基本块或函数的特征都能在一定程度上反映指令的SDC脆弱性,通过分析指令及其所在的基本块和函数,提取出我们所关注的特征.
算法1.基于程序依赖图PDG分析指令依赖特征
输入:程序依赖图PDG(V,E)
输出:每条指令的依赖特征
1:SetEndPointOpcodeas {store,cmp,call},ListL() as null
2:Identify the backward slice ofIOand sae it as an istruction chainSB(IO)
3:forallIiinPDGdo
4:ifIi.opcode=cmpandIi.dest_operand!=øthen
5: analyze features of category 3 in table 3
6:elseifIi.dest_operand!=øthen
7: Identify the forward sice ofIiand save it as an instruction chainSF(Ii)
8:L().add(Ii)
9:iterateIk∈SF(Ii)do
10:ifIk.opcode∈EndPointOpcodethen
11:Ii.Iend=Ik
12: GeneratepfromIitoIi.Iend
13:enditeration
14:endif
15:endfor
16:forallIiinL()do
17: find the consecutiveImaskinIi.pand save it as ListLmask()
18:reverseiterateIj∈lmask()do
19:Pmask(I.Pre,p)=Pmask(I)+(1-Pmask(I))×Pmask(I.Suc,p)
20:enditeration
21:ifIi.Iend.opcode=store/calldo
22: analyze features of category 1 and 2 in table 3
23: analyze the forward slice ofIendand get features of category 3 and 4
24:else
25: analyze features of category 3 in table 3
26:endif
27:endfor
图5 指令依赖特征分析算法
Fig.5 Algorithm of instruction dependence features analysis
4.3.1 指令类别
不同的指令发生瞬时故障后程序的失效结果与其种类是高度相关的.图 6为在我们的训练程序集中注入故障后按指令类别进行分类的统计结果.对于二元操作,浮点数之间的运算由于其工作方式会对瞬时造成屏蔽,因此SDC脆弱性较低.与地址操作相关的指令有极大的概率会造成程序的崩溃降低了它的SDC脆弱性.而程序中的整型二元操作、比较指令等若发生瞬时故障则有极大的概率传播到最后的结果中造成最终的SDC错误.本文将指令类别抽象为一个特征向量,包含8个元素,分别表示该指令是否为整型二元操作、是否为浮点型二元操作、是否为比较指令、是否为逻辑操作、是否为转换操作、是否为地址相关的操作、是否为函数调用指令、是否为内存读指令.
4.3.2 基本块和函数相关的特征
在程序执行的过程中,指令所在的基本块和函数相关的属性都会对指令的SDC脆弱性造成影响.文献[12]中的实验结果也表明了指令所在函数的执行时间这个特征在训练脆弱性预测模型时重要性系数达到了0.55.因此,本文提取了指令所在的基本块和函数相关的6个特征,如表 4所示.
图6 指令类别对程序结果的影响Fig.6 Effect of instruction category on execution results
类 别特征名描述 基本块函数bb_lengthis_within_loopbb_remaining_ins_numins_func_dynamic_count_ratiocall_numfun_remaining_ins_num指令所在基本块的大小指令是否在循环中到基本块结束还需执行的指令数指令与函数执行时间的比值指令所在函数被调用的次数到函数返回还需执行的指令数
4.3.3 其它特征
文献[2]中对影响全局内存和函数参数的变量进行了保护;文献[18]中提出使用变量的扇出值作为是否保护变量的依据,具有高扇出的位置通常是堆栈或栈指针,这些位置的错误可能会导致程序的崩溃.因此,我们选取了指令中变量是否是全局变量和变量的扇出值这两个特征.
基于第4节提取的影响SDC脆弱性的指令特征,本文设计的指令SDC脆弱性分析流程如图 7所示.主要分为数据集构建和指令脆弱性预测两个部分.下面对这两个部分分别进行介绍.
首先,将训练程序和测试程序编译为IR中间代码;然后通过故障注入实验获取IR中间代码中指令的SDC脆弱性;最后,第4节的指令特征分析与提取部分为指令脆弱性分析所需要的指令特征库的构建提供了依据,通过编写LLVM流程对IR进行分析提取我们关注的指令特征.
文献[12]中使用分类回归树模型对指令的SDC脆弱性进行预测,该模型在处理各类别样本数量不一致的情况时,信息的增益会偏向具有更多数值的特征,且这种模型忽略了数据集特征之间的相关性.在我们的实验中,需要在程序编译的过程中直接获取我们需要的指令特征并通过训练出的SDC脆弱性预测模型直接得出指令的脆弱性从而指导程序检测机制的部署.因此,采用的训练模型需要对新样本有较高的适应能力,考虑到支持向量机模型较高的泛化性能且不需要调节过多的参数,本文采用支持向量机(Support Vector Machine,SVM)来训练我们的脆弱性预测模型.
图7 指令SDC脆弱分析流程图Fig.7 Flow chart of instruction SDC vulnerability analysis
为了验证所提出方法的有效性,本文进行了相关的实验.实验使用的环境如下:操作系统Ubuntu 16.04.1,CPU为Intel Core i5-4200H,内存为8GB.我们使用LLVM 3.4来编译源程序得到IR中间代码,使用LLFI工具对其进行故障注入实验.考虑到多处理器平台没有在星上得到广泛应用且成本较高,而我们的容错系统主要应用于空间的嵌入式系统,本文仅讨论单线程实现的程序.我们使用的基准程序集为嵌入式基准测试集合MiBench,图 1中给出的程序为训练程序,选取qsort、dijkstra、susan作为测试程序来比较我们的方法的具体效果.
本文从准确率、相关性、时间代价3个方面来评价我们的基于机器学习的SDC脆弱性分析方法.
和之前的工作一样,用得到的程序的SDC脆弱性来衡量脆弱性分析方法的准确率[12,17].在我们的方法中,程序的SDC脆弱性的计算过程如式(4)所示,PSDC(Ii)为我们的预测模型预测出的指令Ii的SDC脆弱性,Ni为指令Ii的动态执行数,NP为整个程序的动态指令数.通过将我们的方法得到的SDCrate、文献[12]中的SDCTune方法得到的SDCrate、文献[17]中的ePVF方法得到的程序SDC错误率(通过崩溃模型计算得到)以及故障注入方法得到的程序SDC错误率进行对比,结果如图 8所示.
(4)
图8 准确率比较Fig.8 Comparison of accuracy rate
由图 8可知,三个测试程序的平均SDC脆弱性为21.3%,而通过故障注入实验得到的平均SDC脆弱性为19.1%.本文预测的SDCrate会略高于故障注入实验得到的值即真实的程序发生SDC错误的概率.而ePVF方法是通过计算程序崩溃的概率反过来推算程序的SDC错误率,会高出准确的SDC错误率,得到的平均脆弱性达到了23.8%.通过分析通过我们的方法得到的预测的结果,产生误差的原因是故障在传播的过程会被程序特定的性质屏蔽,如浮点运算中的正确性检查、不会影响程序输出的分支指令等.
相关性用来衡量我们的预测模型预测出的指令SDC脆弱性和实际由故障注入得到的准确值之间的相关性.在对程序进行选择性保护时只需选择相对较脆弱的指令,不需要对其脆弱性进行完全准确的预测,因此相关性是衡量预测结果的重要指标.时间代价用来衡量特征提取所需要的时间.本文比较了本方法、SDCTune方法、故障注入方法以及ePVF方法在相同输入下的预测相关性和时间代价,如表 5所示.其中,由于故障注入方法得到的SDC脆弱性为准确值,所以其相关性为1.同时,由于故障注入方法的时间过长,在时间代价的比较中将其忽略.
表5 相关性和时间代价
Table 5 Comparison of correlation and time spent
程 序相关性时间代价/s本文方法SDCTuneFIePVF本文方法SDCTuneFIePVFqsort0.9120.84210.8035642-49dijkstra0.9030.87910.812132105-126susan0.9260.83710.793249204-237
由表5可知,本文的方法平均预测相关性为0.914,高于SDCTune方法的0.853以及ePVF方法的0.803.与ePVF方法相比,时间代价高出了6.1%,但我们的方法的预测相关性要高于ePVF方法.因为本文对程序中所有的指令进行了特征提取并预测了脆弱性,而SDCTune方法仅考虑了存储指令和比较指令,其余指令是通过工具进行依赖关系分析得到粗略的估计,所以我们的方法在预测相关关系方面会优于SDCTune方法.由于SDCTune方法仅需要对程序中的存储和比较指令进行特征提取,所需要的时间代价较小.我们的方法在特征提取是比它增加了平均24.5%的时间,但我们的方法不需要进行额外的依赖关系分析,可以在程序编译时完成指令特征的提取.
针对故障注入方法分析指令SDC脆弱性需要耗费较大的代价,本文提出了一种基于机器学习的指令脆弱性分析方法.该方法利用程序分析技术在程序编译的中间代码阶段提取反映指令脆弱性的特征作为特征向量,训练基于支持向量机的指令脆弱性预测模型,定量的对指令的脆弱性进行了分析,同时也通过实验说明了该方法的有效性.该方法可以得到程序中较为脆弱的指令,对研究检测机制的部署以及检测代价的优化等内容有重要的意义.
[1] Baumann R.Soft errors in commercial semiconductor technology:overview and scaling trends[C].IEEE 2002 Reliability Physics Tutorial Notes,Reliability Fundamentals,2002.
[2] Feng S,Gupta S,Ansari A,et al.Shoestring:probabilistic soft error reliability on the cheap[C].International Conference on Architectural Support for Programming Languages and Operating Systems(ASPLOS),2010:385-396.
[3] Wang N J,Patel S J.ReStore:symptom-based soft error detection in microprocessors[J].IEEE Transactions on Dependable and Secure Computing(TDSC),2006,3(3):188-201.
[4] Hari S K S,Adve S V,Naeimi H.Low-cost program-level detectors for reducing silent data corruptions[C].IEEE/IFIP International Conference on Dependable Systems and Networks(DSN),2012:1-12.
[5] Hari S K S,Adve S V,Naeimi H,et al.Relyzer:exploiting application-level fault equivalence to analyze application resiliency to transient faults[J].Computer Architecture News(CAN),2012,40(1):123-134.
[6] Li J,Tan Q.SmartInjector:exploiting intelligent fault injection for SDC rate analysis[C].IEEE International Symposium on Defect and Fault Tolerance in Vlsi and Nanotechnology Systems(DFT),2013:236-242.
[7] Xu X, Li M L. Understanding soft error propagation using efficient vulnerability-driven fault injection[C]. IEEE/IFIP International Conference on Dependable Systems and Networks(DSN),2012:1-12.
[8] Yang Xue-jun,Gao Long.Error flow model:modeling and analysis of software propagating hardware faults[J].Journal of Software,2007,18(4):808-820.
[9] Pattabiraman K,Nakka N,Kalbarczyk Z,et al.SymPLFIED:symbolic program-level fault injection and error detection framework[J].Computers IEEE Transactions on(TC),2013,62(11):2292-2307.
[10] Ma Jun-chi,Wang Yun,Cai Zhen-bo,et al.An approach for identifying SDC-causing instructions by fault propagation analysis[J].Journal of Computer Research and Development,2016,53(9):1943-1952.
[11] Bronevetsky G,de Supinski B,Schulz M.A foundation for the accurate prediction of the soft error vulnerability of scientific applications[R].Lawrence Livermore National Laboratory(LLNL),Livermore,CA,2009.
[12] Lu Q,Pattabiraman K,Gupta M S,et al.SDCTune:a model for predicting the SDC proneness of an application for configurable protection[C].International Conference on Compilers,Architecture and Synthesis for Embedded Systems(CASES),2014:1-10.
[13] Shivakumar P,Kistler M,Keckler S W,et al.Modeling the effect of technology trends on the soft error rate of combinational logic[C].IEEE/IFIP International Conference on Dependable Systems and Network(DSN),2002:389-398.
[14] Wang H,Wang H,Jin Z.Bipartite graph-based control flow checking for COTS-based small satellites[J].Chinese Journal of Aeronautics(CJA),2015,28(3):883-893.
[15] Wei J,Thomas A,Li G,et al.Quantifying the accuracy of high-level fault injection techniques for hardware faults[C].IEEE/IFIP International Conference on Dependable Systems and Networks(DSN),2014:375-382.
[16] Weiser M.Program slicing[C].International Conference on Software Engineering(ICSE),1981:439-449.
[17] Fang B,Lu Q,Pattabiraman K,et al.ePVF:an enhanced program vulnerability factor methodology for cross-layer resilience analysis[C].IEEE/IFIP International Conference on Dependable Systems and Networks(DSN),2016:168-179.
[18] Pattabiraman K,Kalbarczyk Z,Iyer R K.Application-based metrics for strategic placement of detectors[C].Pacific Rim International Symposium on Dependable Computing,IEEE Computer Society(PRDC),2005:75-82.
附中文参考文献:
[8] 杨学军,高 珑.错误流模型:硬件故障的软件传播建模与分析 [J].软件学报,2007,18(4):808-820.
[10] 马骏驰,汪 芸,蔡震波,等.基于错误传播分析的SDC脆弱指令识别方法 [J].计算机研究与发展,2016,53(9):1943-1952.