发明名称 一种基于CFG的异常信息建立方法
摘要 本发明公开了一种基于CFG的异常信息建立方法,是应用于C++的异常处理代码中,所述异常处理代码中包含try块和对应的一个或多个catch处理块;其特征在于:通过GCC编译器提供的插件功能获得初步的异常信息,结合源代码的插桩技术,以获得完整的异常信息。本发明是对静态分析的一次很好补充,通过识别并构建程序已有的异常信息,为静态源代码分析做准备。
申请公布号 CN104407858A 申请公布日期 2015.03.11
申请号 CN201410658922.1 申请日期 2014.11.18
申请人 合肥康捷信息科技有限公司 发明人 顾乃杰;黄理;任开新;杜云开
分类号 G06F9/44(2006.01)I 主分类号 G06F9/44(2006.01)I
代理机构 安徽省合肥新安专利代理有限责任公司 34101 代理人 何梅生
主权项 一种基于CFG的异常信息建立方法,是应用于C++的异常处理代码中,所述异常处理代码中包含try块和对应的一个或多个catch处理块;其特征是,所述异常信息建立方法是按如下步骤进行:步骤1、通过插桩方法在所述异常处理代码中所有try块的开始位置进行标记,从而获得包含标记信息的插桩代码;步骤2、将所述插桩代码进行编译,获得以CFG表示的中间代码,在所述中间代码中根据所述标记信息,提取所有try块的开始位置,从而形成只包含所述开始位置的try块结点组成的链表,并设为TRY_LIST初始链表;步骤3、遍历所述间代码中所有catch处理块,根据每个catch处理块自身的开始位置和结束位置进行提取,从而形成包含开始位置和结束位置的catch处理块结点组成的链表,并设为CATCH_LIST链表;步骤4、遍历所述CATCH_LIST链表,根据所述CATCH_LIST链表中每个catch块结点的开始位置附带的编号,提取出所有具有相同编号的catch处理块结点组织成一个子链表,从而生成catch处理块列表,所述catch处理块列表中的每个列表结点都指向各自具有相同编号的子链表;步骤5、以所述catch处理块列表中的编号作为关键字对每个列表结点按从小到大的顺序进行排序,形成排序后的catch处理块列表;步骤6、将所述排序后的catch处理块列表中的每个列表结点与所述TRY_LIST初始链表中的每个try块结点依次进行对应,使得一个列表结点只对应一个try块结点,从而获得对应后的catch处理块列表;步骤7、遍历所述对应后的catch处理块列表,判断所述子链表中是否有一个catch处理块结点的结束位置包含自身的跳转信息,若有,则根据所述跳转信息获得与所述列表结点对应的try块结点的结束位置;否则,将与所述列表结点对应的try块的自身结束位置标记为记号∞;从而获得所有包含开始位置和结束位置的TRY_LIST链表,由所述对应后的catch处理块列表和所述TRY_LIST链表建立try‑catch的初步异常信息;步骤8、假设所述TRY_LIST链表中包含有n个try结点,记为X={x<sub>1</sub>,x<sub>2</sub>,…,x<sub>i</sub>,…,x<sub>n</sub>},x<sub>i</sub>表示任一try结点,1≤i≤n;将所述任一try结点x<sub>i</sub>的开始位置和结束位置分别记为<img file="FDA0000610655280000011.GIF" wi="63" he="74" />和<img file="FDA0000610655280000012.GIF" wi="123" he="72" />步骤9、遍历所述TRY_LIST链表的每个try结点,判断当前遍历的try结点x<sub>i</sub>是否为空;若是,则表示所述TRY_LIST链表中try结点之间的父子关系建立完成,从而使得所述初步异常信息生成完整异常信息,并执行步骤11;否则,执行步骤10;步骤10、判断try结点x<sub>j</sub>是否为空,i+1≤j≤n;若为空,则将i+1的值赋给i,并执行步骤9;否则,判断try结点x<sub>i</sub>的结束位置<img file="FDA0000610655280000021.GIF" wi="51" he="69" />是否包含记号∞,若包含,则将i+1的值赋给i,并执行步骤9;否则,判断try结点x<sub>j</sub>的结束位置<img file="FDA0000610655280000022.GIF" wi="51" he="80" />是否包含记号∞,若包含,则将j+1的值赋给j,并执行步骤10;否则,将try结点x<sub>i</sub>的开始位置<img file="FDA0000610655280000023.GIF" wi="50" he="69" />和结束位置<img file="FDA0000610655280000024.GIF" wi="52" he="67" />分别与try结点x<sub>i+1</sub>的开始位置<img file="FDA0000610655280000025.GIF" wi="69" he="59" />和结束位置<img file="FDA0000610655280000026.GIF" wi="69" he="59" />依次进行比较,若<img file="FDA0000610655280000029.GIF" wi="154" he="80" />且<img file="FDA00006106552800000210.GIF" wi="190" he="80" />则将try结点x<sub>i</sub>作为try结点x<sub>j</sub>的父结点,若<img file="FDA00006106552800000212.GIF" wi="153" he="80" />且<img file="FDA00006106552800000211.GIF" wi="185" he="80" />则将try结点x<sub>j</sub>作为try结点x<sub>i</sub>的父结点;将j+1的值赋给j,并执行步骤10;步骤11、以所述完整异常信息作为所述异常代码对应的异常信息。
地址 230000 安徽省合肥市望江西路和创新大道交叉口中国科学技术大学先进技术研究院综合大楼A526