CN103559125B - 一种利用图同构验证编译器的方法 - Google Patents

一种利用图同构验证编译器的方法 Download PDF

Info

Publication number
CN103559125B
CN103559125B CN201310512437.9A CN201310512437A CN103559125B CN 103559125 B CN103559125 B CN 103559125B CN 201310512437 A CN201310512437 A CN 201310512437A CN 103559125 B CN103559125 B CN 103559125B
Authority
CN
China
Prior art keywords
node
program
information
statement
graph
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201310512437.9A
Other languages
English (en)
Other versions
CN103559125A (zh
Inventor
冯素梅
刘建龙
李幼媛
袁劲涛
杨晓豫
赵云飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China General Nuclear Power Corp
China Techenergy Co Ltd
Original Assignee
China General Nuclear Power Corp
China Techenergy Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by China General Nuclear Power Corp, China Techenergy Co Ltd filed Critical China General Nuclear Power Corp
Priority to CN201310512437.9A priority Critical patent/CN103559125B/zh
Publication of CN103559125A publication Critical patent/CN103559125A/zh
Application granted granted Critical
Publication of CN103559125B publication Critical patent/CN103559125B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开一种利用图同构验证编译器的方法,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,并在此基础上,分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,从而得到编译器是否安全的结论。本发明通过判断对比程序与源程序的控制流图是否同构,来验证编译器的安全性。该方法直接将反编译后的代码与源代码进行语义比较,避免了验证过程中由于源代码信息丢失导致验证不全面的问题,该算法不需要再次遍历控制流图,使得图同构判断算法简单,易于实现。

Description

一种利用图同构验证编译器的方法
技术领域
本发明涉及核电领域,具体涉及核电中用于生成安全级代码的编译器的安全性验证方法。
背景技术
编译器作为软件的生成工具,在那些对软件安全性要求十分高的特殊环境里面,其安全性至关重要,特别是用于核安全级保护系统的软件。在核安全级系统中,一方面为了保证软件运行的安全性,程序员经常会引入查错程序或者防御性的程序,而经过编译后的目标代码为了保持源代码的安全性,要求编译器不能在无警告或提示下删除程序员引入的防御程序或查错程序,从而导致目标程序不符合安全级软件的要求;另一方面,由于编译器的漏洞以及人为的后门程序可能会对整个软件造成根本性的破坏,所以,要求编译器在编译的过程中不会人为的插入恶意代码。由此,在验证编译正确性的基础上必须从以上两个方面验证编译器的安全性。
目前对于编译器的验证技术主要有形式化验证技术以及测试验证技术,其中,形式化验证技术是从编译器本身的正确性或者是从保证被编译对象的正确性入手进行证明,但是这个方法实现难度较大,成功案例也仅限应用于某个语言子集的证明,很难推广到现有的工程应用上来。而测试验证技术由于无法对其输入进行全覆盖,以及编译器的复杂性所带来的巨大工作量,使得仅靠测试验证技术难以完成对编译器的完整的验证。
此外,这些验证技术仅基于编译器逻辑正确性的验证,即对源代码和目标代码行为是否一致的验证,且都没有很好的解决编译器对恶意代码注入的问题,以及编译器对那些不影响动态语义的防御程序的删除的问题。故除了依赖对编译器的逻辑正确性验证之外,还需要多遍交叉编译、目标文件结构化比较、目标文件反编译逻辑比较等理论和方法完成对安全性的验证。
在现有技术中验证代表包括:(1)、ISTec利用反编译技术由独立的小组开发从目标程序翻译到源程序的反编译器,比较源代码与目标代码反编译后的代码的一致性,来实现对编译器的正确性验证的方式。
(2)、XavierLeroy带领的CompCert项目组利用定理证明的形式化方法首次完成了从Clight到PowerPC转换过程的正确性形式化验证。但是,这种针对编译器本身的形式化验证方法一般较难实现,且证明整个编译器的正确性也比较困难,即使是CompCert小组也只是针对编译器的后端进行了证明。
(3)、俞甲子基于GCC编译器提出了一种除了能够验证编译器逻辑正确性之外,还可对编译器的安全性进行验证的方法。该方法结合了编译器代码分析及对比验证方案和源代码与目标代码控制流图同构比较方案。其中编译器代码分析及对比验证方案首先对编译器的设计及源代码进行分析,针对每个函数进行分类,对能够改变输入数据的函数进行重新编写,对比原始版本的数据结构和重新设计的数据结构;控制流图同构比较方案是采用对源代码和目标代码抽取控制流图,并判断控制流图是否同构来排除编译时是否人为的插入恶意代码。
发明内容
为解决现有技术中无法验证编译器安全性的问题,本发明提供一种利用源程序和对比程序的控制流图是否同构的方法来检测编译器的安全性。具体方案如下:一种利用图同构验证编译器的方法,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,其特征在于,在此基础上分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,从而得到编译器是否安全的结论,具体步骤如下:
步骤1、首先对源程序和对比程序的语句按顺序进行扫描,并利用带序号的结点进行标识,同时标明各结点的出边信息;
步骤2、同时建立一个辅助栈表,并将当前结点及相关结点信息压入辅助栈表;
步骤3、对条件结构的所有结点进行简化并用简化结点替代,然后将简化结点压入辅助栈表原条件结构的结点位置处形成简化栈表,并且在程序中所有结点被扫描完成之后,将栈表中的结点依次出栈,在上述简化过程中,建立该结点的邻接链表,同时建立一个记录简化结点信息的简化信息表;
步骤4、根据结点的邻接链表和简化信息表建立源程序和对比程序的出入度信息,并生成相应的n点连通子图的出入度序列;
步骤5、根据出入度序列判断源程序和对比程序的控制流图是否同构;其中,当两个控制流图中的任意n点连通子图的出入度序列相同时,则表明两个控制流图是同构的,进而表明源程序与目标程序是相同的,并得到编译器是安全的结果;反之,则证明编译器是不安全的。
为根据不同的结构设置相应的结点:所述步骤1中,结点的添加标准如下:
步骤11、首先在源程序和对比程序的开始和结尾分别增加一个开始结点和终止结点;
步骤12、顺序执行的语句(程序)用一个结点标识;
步骤13、条件语句的起始句用一个条件起始结点标识,中间的各条件表达式分别用一个中间结点标识,同时增加一个条件语句的条件结束结点;
步骤14、循环语句的起始句用一个执行结点标记,结尾语句用一个判断结点标记;
步骤15、在分析时遇到RETURN语句则单独添加一个返回结点。
为建立出入度信息:各结点的出边连接方法如下:
步骤31、按各结点排列顺序依次连接;
步骤32、遇到条件语句的结点时,条件起始结点与各中间条件表达式的中间结点按顺序连接,如遇到返回结点时,则返回结点的出边直接与终止结点连接,否则按顺序连接条件结束结点;
步骤33、遇到循环语句的结点时,执行语句结点指向判断结点,判断结点分别指向执行语句结点和顺序排列的下一个结点。
为方便后续检索:所述辅助栈表的基本信息包括如下内容:
A、按分析顺序生成的各结点的类型,包括顺序类型、条件类型和循环类型,各类型以相应结构的起始句为标识进行区分;
B、各结点对应的排列序号;
C、每个结点所包含的结点数量;
D、所包含的return语句数量。
为方便查找各结点:所述步骤3中,邻接链表记录每个结点的出边信息,并记录所有邻接链表的表头指针信息以作为检索信息。
为方便查找简化结点的信息:所述步骤3中,简化信息表的内容包括结点名、被简化结构包含的结点个数、起始结点和终止结点名,以及所涉及的return分支数量。
为方便源程序和对比程序的对比:所述步骤4中,出入度序列的建立方法如下:
步骤41、根据邻接链表中的结点信息统计出各结点的出度和入度信息;
步骤42、然后依次读取简化栈表中各结点的信息,遇到简化结点时,并用简化结点及其出度、入度信息去更换被简化结构相应位置结点的出度、入度信息,同时更新该被简化块的出入度信息,并且连同该简化块的结点总数一起记录下来;
步骤43、分别统计更新后源程序和对比程序的n点连接子图的出入度序列,并对其中的出度和入度按大小进行排序。
本发明在利用反编译技术的基础上,将目标代码反编译之后的对比程序与源程序利用常规手段进行语义一致性比较,验证编译器的正确性;然后判断反编译之后的对比程序与源程序的控制流图是否同构,来验证编译器的安全性。该方法直接将反编译后的代码与源代码进行语义比较,避免了验证过程中由于源代码信息丢失导致验证不全面的问题,并且在进行安全性验证时,提出了在同一语言下进行程序控制流图同构判定算法,该算法只需要实现一种语言下程序的信息提取,并借此信息进行控制流图同构的判定,不需要再次遍历控制流图,使得控制流图同构判断算法简单,易于实现。另外,由于恶意代码和防御程序以及查错程序一般包含一定的条件判断语句,能够改变程序的控制流图,因此,通过验证程序的控制流图是否同构来判断编译器在编译的过程中是否改变了程序的结构,从而达到验证编译器的安全性的目的。
附图说明
图1源程序和对比程序正确性和安全性验证的示意图;
图2本发明中顺序结构的结点标识示意图;
图3本发明中条件结构的结点标识示意图;
图4本发明中do_while循环结构的结点标识示意图;
图5本发明中while_do循环结构的结点标识示意图;
图6本发明的流程示意图。
具体实施方式
本发明利用图同构验证编译器的方法,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,在此基础上分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,本发明的验证环境是C语言。
如图1所示,例:首先用待验证编译器Generator将源程序programA转换成目标程序programB;
新开发一个针对目标程序programB的反编译器Generator_verify;
将目标程序programB利用反编译器Generator_verify编译生成对比程序programA’;
如果想验证编译器Generator的正确性,可以通过静态分析、模型检验或者自动定理证明等方式来验证programA和programA’的语义一致性来达到目的。
而为检测编译器Generator的安全性则需要首先建立源程序programA和对比程序programA’控制流图信息,然后进行同构判定。
本发明的实现原理是:控制流图可以由邻接链表表示法来存储,并且这种方法便于计算每个结点的出入度,因此本发明采取邻接链表的存储方式记录结点的出边信息;为获得程序的控制流图结点信息,并且便于后续图同构的判定,只需要计算每个连通子图的出入度,所以,在搜集程序控制流图信息的过程中重点记录图中每个结点的出入度,以及连通子图的出入度信息;然后根据记录的结点信息建立连通子图的出入度序列并进行比较,以判断源程序和对比程序的控制流图是否同构的结论。
程序控制流图是描述程序控制逻辑的一种有向图,图中的每个结点对应于一个顺序流程的程序代码块或者谓词,弧对应程序的转移。对于程序来说,其控制流图比较特殊,只有循环结构块的部分存在强连通子图,其余的结构只存在单向连通子图,所以在对程序结构进行归约的过程中重点记录每个被简化结构块的结点个数,以及该结构与图中其余结点相联系的连接点。
在符合结构化程序设计思想这一前提下,一个程序的控制流图可由下述三种基本结构组合而成:顺序结构、if-elseif-…-else和switch代表的分支结构、while-do和do-while代表的循环结构,其中顺序结构中的语句可以扩展,可以是分支结构或循环结构。
如图6所示,本发明的具体步骤如下:
101、首先对源程序和对比程序的语句按顺序进行扫描,并利用带序号的结点进行标识,同时标明各结点的出边信息;
1、首先在源程序和对比程序的开始和结尾分别增加一个开始结点和终止结点,如:START和END分别表示起始和结束结点。
2、然后对整个程序进行分析并增加相应结点,在出入边的连接上,基本原则是按各结点排列顺序依次连接,遇到条件语句的结点时,条件起始结点与各中间条件表达式的中间结点按顺序连接,如遇到返回结点时,则返回结点的出边直接与终止结点连接,否则按顺序连接条件结束结点;如:
如图2所示,顺序执行的语句作为一个基本块,如果最后的语句不是return语句,由一个结点代替;否则,除return之外的语句由一个结点代替,而return单独一个结点。
如图3所示,对于条件语句的选择结构块,起始句用一个条件起始结点标识,中间的各条件表达式分别用一个中间结点标识,同时增加一个条件语句的条件结束结点;如:是if-elseif-…-else,则增加一个中间结点IFELSE_END1,并将所有的条件表达式作为谓词结点,顺次连接,所有的条件语句按照顺序结构处理,该结构块的入边连接点为对应的条件表达式,出边连接点为IFELSE_END1。但选择结构块中如果含有return语句,则出边连接END结点。
是switch时,将表达式及其对应的case值都作为谓词结点顺次连接,case语句的处理和if一致,记增加的中间结点为SWITCH_END1。结点之间的连接关系和if-elseif-…-else结构一致。
遇到循环语句的结点时,执行语句结点向判断结点出边,判断结点分别向执行语句结点和顺序排列的下一个结点出边。如图4、5所示,分别是do_while和while_do两种循环结构的结点标识示意。
102、同时建立一个辅助栈表,并将当前结点及相关结点信息压入辅助框;
其中辅助栈表用于压入顺序扫描时标识的结点及相关结点信息,这些结点信息与生成的后继结点有关,为结点的连接提供信息,其中的结点信息包括结点类型、结点序号和当前结点的数量以及return语句数量,当是条件结构时,结点的数量则为此结构所包含的结点个数,上述信息为判定控制流图同构时提供信息,
1、其中的结点类型记录每条语句的类型,如:是return语句记为RETURN,其余顺序结构的语句记为STATEMENT,如果是do_while循环结构的第一条语句序号,其类型记为DOWHILE_STATEMENT;每个块结构的开始谓词则记为IFELSE_PREDICATE、SWITCH_PREDICATE、WHILEDO_PREDICATE,其余谓词的均为PREDICATE;
2、结点序号为每条语句或者块的序号;
3、结点数目num,记录每个结点的个数,如果是简化结点,则记录的是被简化结构块所包含的结点个数;
4、Retrun语句数目retun_num,记录return语句的数目,主要是为了在简化条件结构时,统计该结构与其它结点的连接信息。
辅助栈表的内容如下表所示:
为了解每个结点的信息,本发明针对辅助栈表中的每一个结点分别建立一个邻接链表Li,用于记录每个结点的出边对应的邻接点,即对控制流图的每个结点建立一个邻接关系的单链表,每个结点的单链表表示以该结点为起点的所有的下一个邻接点的信息。并把他们的表头指针及结点存储起来,便于检索。并增加结点START和END的链表,分别表示开始结点和结束结点。
103、对条件结构的所有结点进行简化并用简化结点替代,然后将简化结点压入辅助栈表原条件结构的结点位置处形成简化栈表,并且在程序中所有结点被扫描完成之后,将栈表中的结点依次出栈,在上述简化过程中,建立该结点的邻接链表,同时建立一个记录简化结点信息的简化信息表;
1、具体简化过程为:读取辅助栈表中的内容并依次出栈去更新简化栈表,如遇到选择结构块IFELSE_PREDICATE时,增加一个替换的简化结点并压入辅助栈表中,将该IFELSE_PREDICATE选择结构块中包含的所有结点由此简化结点代替,即用名称为IFELSE_BLOCK1的简化结点代表当前的选择结构块结点名,如用IFELSE_BLOCK1表示简化结点名,在辅助栈表中的信息即为STATEMENT,IFELSE_BLOCK1,sum,sum_return其中四项所表示的内容与辅助栈表中的意思一致,只是sum在这里代表的是此简化结点共简化了几个结点数量,sum_return代表该被简化结构直接相联接地return分支数量,对应于该结构的出边,而压入了简化结点的辅助栈表就变成了简化栈表。
针对简化栈表中的简化结点,用一个简化信息表来记录,包括简化结点的名称、简化前的结点数量,被简化结构块的起始和终止结点,被简化块中包含的return分支个数,例:
IFELSE_BLOCK1在简化信息栈表中的记录信息为IFELSE_BLOCK1,sum,IFELSESTART1,IFELSE_END1,sum_return,其中IFELSESTART1为IFELSE_PREDICATE对应结点名,IFELSE_END1为结束结点。如果sum:=1,则不存在结点IFELSE_END1,记录为IFELSE_BLOCK1,1,IFELSESTART1,/\,sum_return。如下表所示,
在处理SWITCH选择结构块时,其处理过程与IFELSE相同。
2、如果遇到循环结构块,如是while_do循环结构,则将当前辅助栈表的栈顶元素对应的辅助链表指向类型为WHILEDO_PREDICATE对应的结点。
更新邻接链表:辅助栈表的次栈顶元素对应的邻接链表指向栈顶元素,更新sum:=sum+top(S).num,栈顶元素出栈,依次执行此动作,直到遇到类型为WHILEDO_PREDICATE的元素。
当WHILEDO_PREDICATE对应的元素出栈后,sum:=sum+top(S).num;增加新的结点,假设序号名为WHILEDO_BLOCK1,将STATEMENT,WHILEDO_BLOCK1,sum,0信息压入简化栈表中。然后更新简化栈表的内容:假设W6HILEDO_PREDICATE对应结点名为WHILEDO_START1,则将WHILEDO_BLOCK1,num,WHILEDO_START1,/\,0信息压入简化栈表。如WHILEDO循环结构的简化过程如下表所示:
如果是do_while循环结构,则:将当前辅助栈表的栈顶元素对应的邻接链表指向类型为DOWHILE_STATEMENT对应的结点,并将栈顶元素对应的name记录下来,假设为DOWHILE_END1。
如果当前栈顶元素类型不为DOWHILE_STATEMENT,则次栈顶元素对应的邻接链表指向栈顶元素,更新sum:=sum+top(s).num,栈顶元素出栈。依次执行此动作,直到遇到类型为DOWHILE_STATEMENT的元素。当DOWHILE_STATEMENT对应的元素出栈,sum:=sum+top(s).num;增加新的结点,假设结点名为DOWHILE_BLOCK1,将STATEMENT,DOWHILE_BLOCK1,sum,0信息压入简化栈表中。
假设DOWHILE_STATEMENT对应结点名为DOWHILE_START1,将DOWHILE_BLOCK1,num,DOWHILE_START1,DOWHILE_END1,0压入简化栈表然,再返回辅助栈表的处理。如DOWHILE循环结构的简化过程如下表所示:
3、当程序中的所有语句被扫描完之后,辅助栈表的栈顶元素对应的邻接链表指向END结点;如果栈顶元素类型为STATEMENT,num=1,retun_num!=0,则栈顶元素不指向任何结点。然后次栈顶元素对应的辅助链表指向栈顶结点,栈顶元素出栈。如果次栈顶元素不为空,依次执行此动作。将START结点对应的邻接链表指向辅助栈表中最后一个元素对应的结点,结束。
104、根据结点的邻接链表和简化信息表建立源程序和对比程序的出入度信息,并生成相应的n点连通子图的出入度序列;
由于前面步骤已经对程序进行了简化,将选择和循环结构归约为一条语句的结点形式,针对每层被简化结构块,其内部的结点是顺序结构,只有一个入边和一个出边,因此,在判断同构时,只需要统计单个结点的出入度和被简化连通子图的出入度信息即可。首先根据每个结点的邻接链表,统计出各结点的出度和入度信息,再读取简化栈表中各结点的信息,遇到简化结点时,用简化结点及其出度、入度信息去更新被简化结构块相关结点的出度、入度信息,其中对源程序和对比程序的控制流图的出入度信息获取步骤如下:
1、需要遍历每个结点的邻接链表,以计算出每个结点的出度di和入度do,再采用依次读取简化信息表的方式,逐个更新被简化结构块的起始和终止结点的出入度信息,更新方法如下:
2、如简化栈表的栈顶元素类型为IFELSE选择结构块化简类型,形式如(IFELSE_BLOCK1,num,IFELSESTART1,IFELSE_END1,return_num)。如果num!=1,被简化的选择结构块包含多个结点,IFELSE_BLOCK1的入度为该选择结构块的第一个结点的入度,IFELSE_BLOCK1的出度为该选择结构块最后一个结点的出度,因此更新原选择结构块的第一个结点入度和最后一个结点的出度的内容如下:IFELSESTART1.di:=IFELSE_BLOCK1.di+IFELSESTART1.di,IFELSE_END1.do:=IFELSE_END1.do+IFELSE_BLOCK1.do;同时记录该结构被简化前的出入度信息和结点个数,假设记为S_IFELSE_BLOCK1:=(IFELSE_BLOCK1,num,IFELSE_BLOCK1.di,IFELSE_BLOCK1.do+return_num)。如果num:=1,被简化的选择结构块分支都指向END结点,此时IFELSE_BLOCK1结点实际上是原选择结构块的第一个结点,且IFELSE_BLOCK1没有后继结点,出度为0,因此更新原选择结构块的第一个结点的入度如下:IFELSESTART1.di:=IFELSE_BLOCK1.di+IFELSESTART1.di;
如果简化栈表栈顶元素类型为SWITCH选择结构块化简类型,形式如(SWITCH_BLOCK1,num,SWITCH_START1,SWITCH_END1,return_num),其处理过程和IFELSE选择结构块处理方式一致;
3、如果简化栈表的栈顶元素类型为WHILEDO循环结构块化简类型,形式如(WHILEDO_BLOCK1,num,WHILEDO_START1,/\,0),则记录该结构的出度和入度,以及num值,假设记为LOOP_WHILEDO_BLOCK1:=(WHILEDO_BLOCK1,num,WHILEDO_BLOCK1.di,WHILEDO_BLOCK1.do);然后更新WHILEDO_START1.di=WHILEDO_START1.di+WHILEDO_BLOCK1.di,WHILEDO_START1.do=WHILEDO_START1.do+WHILEDO_BLOCK1.do;
如果简化栈表的栈顶元素类型为DOWHILE循环结构块化简类型,形式如(DOWHILE_BLOCK1,num,DOWHILE_START1,DOWHILE_END1,0),则记录结点DOWHILE_BLOCK1的出度和入度,以及num值,假设为LOOP_DOWHILE_BLOCK1:=(DOWHILE_BLOCK1,num,DOWHILE_BLOCK1.di,DOWHILE_BLOCK1.do);然后更新DOWHILE_START1.di:=DOWHILE_START1.di+DOWHILE_BLOCK1.di,DOWHILE_END1.do:=WHILEDO_BLOCK1.do+WHILEDO_END1.do。
4、分别统计更换后源程序和对比程序的各结点的出入度序列,并对其中的出度和入度按大小进行排序;对被简化的结构,根据对其结构块包含的结点个数,以及该结构块的出入度信息记录,建立n点连通子图的出入度序列,方法如下:
其中需要将所有结点的出度和入度分别从大到小进行排序(简化后的结点除外),构成n=1时的出入度序列:Si(1),So(1);
针对所有的条件块简化后对应的结点信息记录,按照其结点个数进行分类,如LOOP_DOWHILE_BLOCK1:=(DOWHILE_BLOCK1,num,DOWHILE_BLOCK1.di,DOWHILE_BLOCK1.do)归类为num=k点联通子图,其入度为di,出度为do;将所有的k点类连通子图的出入度从大到小进行排序,构成k点连通子图的出入度序列Si(k),So(k)。
105、根据出入度序列判断源程序和对比程序的控制流图是否同构。
根据出入度序列判断源程序和对比程序的控制流图是否同构。
其中,当两个控制流图中的任意n点连通子图的出入度序列相同时,则表明两个控制流图是同构的,进而表明源程序与目标程序是相同的,并得到编译器是安全的结果;反之,则证明编译器是不安全的。
即对于任意的1<=n<N-1,N是结点个数,分别比较两个图的出入度序列Si(n),So(n),如果均相同,则同构;否则不同构。
以上所述仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例公开如上,然而并非用以限定本发明,任何熟悉本专利的技术人员在不脱离本发明技术方案范围内,当可利用上述提示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明方案的范围内。

Claims (7)

1.一种利用图同构验证编译器的方法,包括待处理的源程序和将源程序生成目标程序的编译器,在选定环境下建立一个反编译器,通过反编译器将目标程序反编译成对比程序,验证对比程序和源程序之间的语义一致性,其特征在于,在此基础上分别建立源程序和对比程序的控制流图相关结点信息后进行同构判定,从而得到编译器是否安全的结论,具体步骤如下:
步骤1、首先对源程序和对比程序的语句按顺序进行扫描,并利用带序号的结点进行标识;
步骤2、同时建立一个辅助栈表,并将当前结点及相关结点信息压入辅助栈表框;
步骤3、对条件结构的所有结点进行简化并用简化结点替代,然后将简化结点压入辅助栈表原条件结构的结点位置处形成简化栈表,并且在程序中所有结点被扫描完成之后,将栈表中的结点依次出栈,在上述简化过程中,建立该结点的邻接链表,同时建立一个记录简化结点信息的简化信息表;
步骤4、根据结点的邻接链表和简化信息表建立源程序和对比程序的出入度信息,并生成相应的n点连通子图的出入度序列,1<=n<N-1,N是结点个数;
步骤5、根据出入度序列判断源程序和对比程序的控制流图是否同构;其中,当两个控制流图中的任意n点连通子图的出入度序列相同时,则表明两个控制流图是同构的,进而表明源程序与目标程序是相同的,并得到编译器是安全的结果;反之,则证明编译器是不安全的。
2.如权利要求1所述的一种利用图同构验证编译器的方法,其特征在于,所述步骤1中,结点的添加标准如下:
步骤11、首先在源程序和对比程序的开始和结尾分别增加一个开始结点和终止结点;
步骤12、顺序执行的语句用一个结点标识;
步骤13、条件语句的起始句用一个条件起始结点标识,中间的各条件表达式分别用一个中间结点标识,同时增加一个条件语句的条件结束结点;
步骤14、循环语句的起始句用一个执行结点标记,结尾语句用一个判断结点标记;
步骤15、在分析时遇到return语句则单独添加一个返回结点。
3.如权利要求1所述的一种利用图同构验证编译器的方法,其特征在于,各结点的出边连接方法如下:
步骤31、按各结点排列顺序依次连接;
步骤32、遇到条件语句的结点时,条件起始结点与各中间条件表达式的中间结点按顺序连接,如遇到返回结点时,则返回结点的出边直接与终止结点连接,否则按顺序连接条件结束结点;
步骤33、遇到循环语句的结点时,执行语句结点指向判断结点,判断结点分别指向执行语句结点和顺序排列的下一个结点。
4.如权利要求1所述的一种利用图同构验证编译器的方法,其特征在于,所述辅助栈表的基本信息包括如下内容:
A、按分析顺序生成的各结点的类型,包括顺序类型、条件类型和循环类型,各类型以相应结构的起始句为标识进行区分;
B、各结点对应的排列序号;
C、每个结点所包含的结点数量;
D、所包含的return语句数量。
5.如权利要求1所述的一种利用图同构验证编译器的方法,其特征在于,所述步骤3中,邻接链表记录每个结点的出边信息,并记录所有邻接链表的表头指针信息以作为检索信息。
6.如权利要求1所述的一种利用图同构验证编译器的方法,其特征在于,所述步骤3中,简化信息表的内容包括结点名、被简化结构包含的结点个数、起始结点和终止结点名,以及所涉及的return分支数量。
7.如权利要求1所述的一种利用图同构验证编译器的方法,其特征在于,所述步骤4中,出入度序列的建立方法如下:
步骤41、根据邻接链表中的结点信息统计出各结点的出度和入度信息;
步骤42、然后依次读取简化信息表中各结点的信息,并用简化结点及其出度、入度信息去更换被简化结构相应位置结点的出度、入度信息,同时更新该被简化块的出入度信息,并且连同该简化块的结点总数一起记录下来;
步骤43、分别统计更新后源程序和对比程序的n点连接子图的出入度,并对其中的出度和入度按大小进行排序。
CN201310512437.9A 2013-10-25 2013-10-25 一种利用图同构验证编译器的方法 Active CN103559125B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310512437.9A CN103559125B (zh) 2013-10-25 2013-10-25 一种利用图同构验证编译器的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310512437.9A CN103559125B (zh) 2013-10-25 2013-10-25 一种利用图同构验证编译器的方法

Publications (2)

Publication Number Publication Date
CN103559125A CN103559125A (zh) 2014-02-05
CN103559125B true CN103559125B (zh) 2015-12-09

Family

ID=50013376

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310512437.9A Active CN103559125B (zh) 2013-10-25 2013-10-25 一种利用图同构验证编译器的方法

Country Status (1)

Country Link
CN (1) CN103559125B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103914657B (zh) * 2014-04-16 2016-10-19 南京大学 一种基于函数特征的恶意程序检测方法
CN104021346B (zh) * 2014-06-06 2017-02-22 东南大学 基于程序流程图的Android恶意软件检测方法
CN106611125A (zh) * 2016-12-12 2017-05-03 中国航空工业集团公司洛阳电光设备研究所 一种验证编译器安全性的方法
CN107391368B (zh) * 2017-07-13 2021-02-09 中国航发控制系统研究所 一种航空机载软件中源代码与目标代码一致性的分析方法
CN109344576B (zh) * 2018-09-17 2023-04-25 三六零科技集团有限公司 一种应用程序处理方法、装置、电子设备及可读存储介质
CN110716855B (zh) * 2019-08-23 2021-05-14 中国科学院信息工程研究所 处理器指令集测试方法及装置
CN116680447A (zh) * 2020-08-18 2023-09-01 上海帆格网络科技有限公司 高效稳定的(子)图(矩阵)同构算法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101216803A (zh) * 2008-01-09 2008-07-09 四川大学 基于基路径的测试程序控制流路径集生成方法
CN102521008A (zh) * 2011-12-28 2012-06-27 用友软件股份有限公司 程序编译装置和程序编译方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8381204B2 (en) * 2008-04-30 2013-02-19 International Business Machines Corporation Compiler driven mechanism for registration and deregistration of memory pages

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101216803A (zh) * 2008-01-09 2008-07-09 四川大学 基于基路径的测试程序控制流路径集生成方法
CN102521008A (zh) * 2011-12-28 2012-06-27 用友软件股份有限公司 程序编译装置和程序编译方法

Also Published As

Publication number Publication date
CN103559125A (zh) 2014-02-05

Similar Documents

Publication Publication Date Title
CN103559125B (zh) 一种利用图同构验证编译器的方法
Feist et al. Slither: a static analysis framework for smart contracts
Schäfer et al. An empirical evaluation of using large language models for automated unit test generation
JP5042315B2 (ja) ソースコード内のセキュリティ脆弱性の検出
Nogueira et al. Test generation from state based use case models
IL97177A (en) Method for creating a consecutive circle
Jiang et al. RULF: Rust library fuzzing via API dependency graph traversal
Kim et al. Software vulnerability detection methodology combined with static and dynamic analysis
Zhang et al. BDA: practical dependence analysis for binary executables by unbiased whole-program path sampling and per-path abstract interpretation
Walkinshaw et al. Inferring computational state machine models from program executions
Semeráth et al. Diversity of graph models and graph generators in mutation testing
Yoshida et al. FSX: Fine-grained incremental unit test generation for C/C++ programs
Green et al. Graphfuzz: Library API fuzzing with lifetime-aware dataflow graphs
Kästner et al. Variability mining with leadt
Mansky et al. Verifying dynamic race detection
Zhang et al. Detecting vulnerabilities in C programs using trace-based testing
Andriushchenko et al. Search and explore: symbiotic policy synthesis in POMDPs
Gonzalez et al. Almost rerere: Learning to resolve conflicts in distributed projects
CN113868136A (zh) 一种基于Go语言可执行形式化语义的程序漏洞分析方法
Garavel et al. State space reduction for process algebra specifications
Gabor et al. High-accuracy software fault injection in source code with clang
Lal et al. Reachability modulo theories
Khalil et al. Optimizing the symbolic execution of evolving rhapsody statecharts
CN111488558B (zh) 脚本保护方法、装置、计算机可读存储介质和计算机设备
CN115310095A (zh) 一种区块链智能合约混合形式化验证方法及系统

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CB03 Change of inventor or designer information

Inventor after: Feng Sumei

Inventor after: Zhao Yunfei

Inventor after: Jiang Guojin

Inventor after: Bai Tao

Inventor after: Sun Yongbin

Inventor after: Liu Jianlong

Inventor after: Li Youyuan

Inventor after: Yuan Jintao

Inventor after: Yang Xiaoyu

Inventor after: Ning Dai

Inventor before: Feng Sumei

Inventor before: Liu Jianlong

Inventor before: Li Youyuan

Inventor before: Yuan Jintao

Inventor before: Yang Xiaoyu

Inventor before: Zhao Yunfei

CB03 Change of inventor or designer information