专利名称:一种51汇编语言软件安全性编码规则自动检查方法
技术领域:
本发明涉及一种软件编码规则自动检查方法,主要应用于针对51汇编语言软件的静态测试。
背景技术:
编码规则自动检查技术是针对软件与所确定的编码规则符合性进行检查的技术, 是软件静态测试技术的一个分支。目前对于C语言的编码规则研究较多,常见的C语言安全编码规则集有 MISRA(Motor Industry Software Reliability Association) C 编码规则等。而针对 C i吾言的常用软件测试工具大都包含针对MISRA等C语言软件编码规则的检查功能。针对汇编语言的编码规则自动检查技术目前研究较少,首先是由于没有制定针对汇编语言的编程规则集;其次,软件的编码规则自动检查技术中最重要的是词法和语法分析和规则匹配技术,而目前针对51汇编语言程序的词法及语法分析、规则匹配技术很少被研究。
发明内容
本发明的技术解决问题是克服现有技术的不足,提供了一种操作简便、准确率高、可扩展性强的51汇编语言软件安全性编码规则自动化检查方法,为针对51汇编语言软件进行安全性编码规则的自动检查提供了依据。本发明的技术解决方案是一种51汇编语言软件安全性编码规则自动检查方法, 步骤如下(1)确定针对51汇编语言的安全编码规则,包括堆栈处理安全性规则、中断处理安全性规则、指令匹配性检查规则、未用中断向量处理安全性规则、避免存在不可达代码安全性规则;所述的堆栈处理安全性规则用于检查程序中堆栈是否存在堆栈不平衡或者堆栈溢出;所述的中断处理安全性规则用于检查程序的中断处理是否存在安全性;所述的指令匹配性检查规则用于检查特定指令与所在子程序是否匹配以及指令与所用操作数之间是否匹配;所述的未用中断向量处理安全性规则用于检查所有未用中断的中断向量处理是否符合安全性要求;所述的避免存在不可达代码安全性规则用于检查程序中是否存在未被调用的子程序或者不可达代码;(2)将源代码按照统一格式重新排版,进行分离代码和注释、提取独立的单词助记符;(3)在重新排版的源代码上增加子程序开始和结束标识,然后从得到的单词助记符中提取伪指令、指令、操作数、行号、标号并与51汇编语言语法规则进行匹配,识别出变量、相关指令、操作数、中断向量区、子程序、中断服务程序,由此提取各个子程序、中断服务程序的名称及起始行号和结束行号,并记录与步骤(1)中制定的安全性编码规则匹配相关的指令所在的行号,以及子程序调用指令和无条件跳转指令的操作数信息;同时对软件代码进行结构分析,得到所有的被调用子程序集合和被跳转标号集合;(4)根据步骤(3)的提取结果以及结构分析结果,依据步骤(1)中制定的安全性编码规则,判断程序代码中是否存在错误并将判断结果输出。本发明与现有技术相比的优点在于本发明提出了一种51汇编语言软件安全性编码规则自动化检查方法,该方法具有分析准确率高、直接对应到源程序、规则可扩展等特点,为针对51汇编语言软件进行安全性编码规则的自动检查提供了简便实用的方法。其中检查所依据的安全性编码规则根据以往51汇编语言编程的错误案例提取,涉及堆栈处理、 中断处理、指令匹配检查等多方面,覆盖性强。通过软件编程,可以使该方法的检查完全自动进行,不需要与人的交互过程。通过对源代码进行的扫描和预处理过程可以使该方法适用于不同编程风格和书写格式的被测程序。通过对被测程序的词法分析、语法分析、结构分析,得到了进行规则匹配所需要的所有信息以及被测程序的其他信息,方便以后增加其他安全性编码规则。同时由于对程序进行了结构分析,大大提高了分析的准确性。最终的结果输出时能直接对应到源程序,方便用户对软件错误进行定位。
图1为本发明方法的流程框图。
具体实施例方式如图1所示,本发明方法主要包括安全性编码规则制定、代码扫描和预处理、程序代码搜索、规则匹配、结果输出等步骤,下面分别进行详细说明。一、安全性编码规则制定本方法所针对的51汇编语言安全编码规则包括堆栈处理的安全性规则。堆栈处理的安全性规则包括保持堆栈平衡的安全性规则和防止堆栈溢出的安全性规则,这是最常见也是最关键安全性规则,一旦违反通常都将导致软件运行崩溃。如规则1 压栈和弹栈指令应匹配出现,规则2 要防止堆栈使用时的溢
出ο中断处理安全性的规则是指针对一些特定中断的处理应符合特定的安全性要求, 如果不符合该要求,将导致软件出现严重错误,如规则3 如果使用了串口中断,则在串口中断服务程序中必须清除RI或者TI (如果软件中没有清除指令会导致重复串口中断的重复触发)。规则4 如果使用了定时器2中断,则在其中断服务程序中必须清除定时器2中断标志;指令匹配性检查规则包括指令与子程序的匹配性检查和指令与操作数的匹配性的检查。指令与子程序的匹配性检查是指某些指令只能用于某种类型的子程序如规则5 中断服务程序的返回指令应使用RETI,非中断服务程序子程序的返回指令应使用RET,不能混用;指令与操作数的匹配性检查是指某些指令只能针对特定类型的操作数,如规则6 指令MOVX的操作数必须包括1个外部地址。未用中断向量处理安全性规则是指未用中断向量的处理应符合安全性要求,否则会导致一旦触发该未用中断就无法从中断中退出的错误或者导致存储器中存在未经处理的空白区,如规则7 针对未使用中断向量的处理必须保证能退出该中断并正常响应其他中断;避免存在不可达代码的安全性规则是指软件中不能存在不可达代码,因为一旦跳入这些代码会导致程序无法继续正确执行如规则8 禁止存在不可达代码。二、代码扫描及预处理主要是对代码按照规定的格式进行重排版,进行分离代码和注释、提取独立的单词助记符。由于被检查软件的编程风格并不统一,为保证后续处理接口的一致性,需要把源代码按照统一格式进行重新排版,通常的方法是把每一行首字符前面的空格全部删除,从而得到统一格式的被检查软件源代码。然后是对排版后的程序进行扫描,首先是剔除注释, 然后按顺序提取单词助记符,并把同一行内的各单词助记符之间均设置为1个空格。三、词法分析、语法分析及结构分析从得到的单词助记符中提取伪指令0)RG、END、EQU、BIT、DATA、DB、DW)、指令、操作数、行号、标号等信息;与51汇编语言语法规则进行匹配,识别出变量(使用EQU、BIT、DATA 进行定义)、相关指令(RET、RETI、PUSH、POP、CLR、MOVX, AJMP, SJMP, LJMP, JZ、JNZ, CJNE, DJNZ, ACALL、LCALL)、操作数(只识别上述相关指令的操作数,其中PUSH、POP、CLR、AJMP, SJMP, LJMP, JZ、JNZ, ACALL、LCALL指令只有1个操作数,CJNE指令有3个操作数,DJNZ指令有2个操作数)、中断向量区(分别使用ORG 0003、ORG 000ΒΗ、ORG 0013H、ORG 001BH、 ORG 0023H进行定义,对应外部中断0、定时器中断0、外部中断1、定时器中断1、串口中断的中断向量区)、子程序、中断服务程序标号(以“”结束的单词助记符)等元素信息;由于51汇编语言程序本身没有子程序开始和结束的标识,因此在进行编码规则检查之前,需要对被检查程序手动增加子程序和中断服务程序的开始标识和结束标识。其中51汇编语言的中断向量考虑的是针对8031 (8051)处理器的情况。此处需要提取各个子程序和中断服务程序的名称及起始行号和结束行号,以及记录所有指令所在行号。结构分析记录所有ACALL、LCALL指令及其操作数的信息,所有ACALL指令和 LCALL指令的操作数即为被调用的子程序,从而可以得到每个子程序调用的其他子程序集合及调用次数的情况。记录所有AJMP、SJMP、LJMP、JZ、JNZ、CJNE、DJNZ指令的操作数(针对CJNE、DJNZ指令只记录最后1个操作数),从而得到所有被跳转的标号集合。四、安全性规则匹配从提取的元素信息中查找相关的元素信息,判断是否符合规则;将规则匹配分解到3个阶段扫描元素信息阶段、查询分析阶段、结构分析阶段。其中扫描元素信息阶段是指在进行词法及语法分析时就完成规则的匹配,这是指代码上下文关系方面的规则,如规则3、规则5 ;而查询分析阶段是指所要分析的规则涉及到多种信息,需要对多种信息进行综合分析后才能得到结果,这是规则匹配的主要阶段,适用于所有主要规则;结构分析阶段则指必须完成对程序结构的分析之后才能得到分析结果的,这是与软件结构相关的规则, 如规则8。下面分别以规则1、3、5、8为例说明如何在不同阶段完成安全性规则的匹配。针对规则1的检查方法压栈和弹栈指令匹配出现是针对同一个子程序而言的,不考虑压栈指令在一个子程序,而弹栈指令在另一个子程序的情况。判断方法为首先找到所有的压栈指令(PUSH)
5和弹栈指令(POP),判断压栈指令和弹栈指令的行号是否在某子程序的范围内,即找到每个子程序所有的压栈(PUSH)指令和弹栈(POP)指令。针对每个子程序的所有压栈(PUSH)指令和弹栈(POP)指令,确认其压栈(PUSH)指令的条数是否与弹栈(POP)指令的条数相对, 然后确定是否满足在程序任一点压栈(PUSH)指令个数不少于弹栈(POP)指令个数。如果满足上述条件,则证明压栈指令和弹栈指令是匹配的,否则是不匹配的。针对规则3的检查方法判断程序中是否使用了串口中断,其方法为根据串口中断向量入口是否存在无条件跳转指令(AJMP、LJMP, SJMP),如果存在无条件跳转指令,并且该跳转指令所跳转的标号为子程序名称的话,则可以确认程序中使用了串口中断。如果确认使用了串口中断,则需要判断在串口中断服务程序中是否存在清除RI (CLR RI)或者TI (CLR Tl)的指令。判断方法为扫描程序中是否存在清除RI (CLR RI)或者TI (CLR Tl)的指令,判断该指令所在的行号是否在串口中断服务程序范围之内。针对规则5的检查方法扫描所有的RET指令和RETI指令,判断所有RET指令所在的行号是否在子程序的起始行号和结束行号所在范围内,所有RETI指令是否是在中断服务子程序的起始行号和结束行号所在的范围内,如果发现不满足,则证明存在违反。针对规则8的检查方法不可达代码包括2种情况,即未被调用的子程序(中断服务程序)和不可达代码。 在针对被测程序进行结构分析(调用关系)后,可以找出是否存在未被调用的子程序,该子程序就是不可达子程序。针对不可达代码的分析则可以在查询分析阶段进行。查询是否有未被跳转的标号,并且该标号所在行的前一条指令仍为无条件跳转指令(AJMP、LJMP、SJMP)。如果存在这种情况,则说明存在不可达代码。五、结果输出最终的检查结果以* .html网页形式输出,包含针对所有安全性编码规则的违反情况统计,针对每条规则的每一处违反均能链接到源代码,并且可以输出一份完整的安全性编码规则分析报告。六、可扩展性说明由于在代码扫描和预处理阶段及词法和语法分析阶段,已经获得了被测软件中所有的变量、指令、子程序、中断向量区、中断服务程序的行号信息,因此可以利用这些信息进行相应规则的扩展,如指令合理性检查、标号名被重用等规则。此外还可以通过结构分析得到的结果,进一步增加对与软件结构相关的规则进行分析,如软件扇出度(即子程序最大调用其他子程序的个数)。本发明说明书中未作详细描述的内容属本领域技术人员的公知技术。
权利要求
1. 一种51汇编语言软件安全性编码规则自动检查方法,其特征在于步骤如下(1)确定针对51汇编语言的安全编码规则,包括堆栈处理安全性规则、中断处理安全性规则、指令匹配性检查规则、未用中断向量处理安全性规则、避免存在不可达代码安全性规则;所述的堆栈处理安全性规则用于检查程序中堆栈是否存在堆栈不平衡或者堆栈溢出;所述的中断处理安全性规则用于检查程序的中断处理是否存在安全性;所述的指令匹配性检查规则用于检查特定指令与所在子程序是否匹配以及指令与所用操作数之间是否匹配;所述的未用中断向量处理安全性规则用于检查所有未用中断的中断向量处理是否符合安全性要求;所述的避免存在不可达代码安全性规则用于检查程序中是否存在未被调用的子程序或者不可达代码;(2)将源代码按照统一格式重新排版,进行分离代码和注释、提取独立的单词助记符;(3)在重新排版的源代码上增加子程序开始和结束标识,然后从得到的单词助记符中提取伪指令、指令、操作数、行号、标号并与51汇编语言语法规则进行匹配,识别出变量、相关指令、操作数、中断向量区、子程序、中断服务程序,由此提取各个子程序、中断服务程序的名称及起始行号和结束行号,并记录与步骤(1)中制定的安全性编码规则匹配相关的指令所在的行号,以及子程序调用指令和无条件跳转指令的操作数信息;同时对软件代码进行结构分析,得到所有的被调用子程序集合和被跳转标号集合;(4)根据步骤(3)的提取结果以及结构分析结果,依据步骤(1)中制定的安全性编码规则,判断程序代码中是否存在错误并将判断结果输出。
全文摘要
一种51汇编语言软件安全性编码规则自动检查方法,首先确定针对51汇编语言的安全编码规则。然后将源代码按照统一格式重新排版,进行分离代码和注释、提取独立的单词助记符。随后在重新排版的源代码上增加子程序开始和结束标识,然后从得到的单词助记符中提取伪指令、指令、操作数、行号、标号并与51汇编语言语法规则进行匹配,识别出变量、相关指令、操作数、中断向量区、子程序、中断服务程序,由此提取各个子程序、中断服务程序的名称及起始行号和结束行号。最后根据提取结果以及结构分析结果,将制定的安全性编码规则作为标准,判断程序代码中是否存在错误并将判断结果输出。本方法具有分析准确率高、直接对应源程序、规则可扩展等特点。
文档编号G06F11/36GK102419730SQ20111041246
公开日2012年4月18日 申请日期2011年12月8日 优先权日2011年12月8日
发明者侯成杰, 常江, 李鹏宇, 欧阳高翔, 武占峰, 段永顥 申请人:北京控制工程研究所