[发明专利]一种面向动态分析的源代码插桩改进方法有效
| 申请号: | 202010539967.2 | 申请日: | 2020-06-15 |
| 公开(公告)号: | CN111736846B | 公开(公告)日: | 2021-06-22 |
| 发明(设计)人: | 陈哲;王冲;孙小祥 | 申请(专利权)人: | 南京航空航天大学 |
| 主分类号: | G06F8/41 | 分类号: | G06F8/41 |
| 代理公司: | 南京经纬专利商标代理有限公司 32200 | 代理人: | 施昊 |
| 地址: | 210016 江*** | 国省代码: | 江苏;32 |
| 权利要求书: | 查看更多 | 说明书: | 查看更多 |
| 摘要: | |||
| 搜索关键词: | 一种 面向 动态 分析 源代码 改进 方法 | ||
1.一种面向动态分析的源代码插桩改进方法,其特征在于:包括对多文件项目、无长度数组和匿名结构体的源代码插桩方法,并通过编译、执行插桩后的程序实现对程序执行过程的动态分析;对多文件项目的源代码插桩方法包括如下步骤:
(1)构造编译数据库,编译数据库为文件或数据库记录的形式,记录了编译器对每个源文件进行编译所使用的编译命令,其中包含了编译所需的全部要素,包括每个源文件对应的执行编译命令的工作目录路径、源文件的相对路径和编译选项;
(2)解析编译数据库,为自动插桩工具构造每个源文件所对应的编译选项,从而保证插桩工具对源文件的正确解析;
(3)对于编译数据库中的所有源文件,根据对应的编译选项对源文件进行解析和插桩。
2.根据权利要求1所述面向动态分析的源代码插桩改进方法,其特征在于:对无长度数组的源代码插桩方法包括如下步骤:
(a)通过分析数组声明或定义,获取该数组的长度;
(b)对于每个数组下标表达式,如果该数组的长度为未定义,则根据如下规则构造数组内存的上界,并进行插桩:
(b1)对于无长度数组定义“int arr[]”,对数组下标表达式“arr[n]”进行插桩后的结果如下:
arr[PRFcheck_dpc_ss(arr,arr+1,arr,n,sizeof(int))]
其中,实参arr表示数组内存的下界,实参arr+1表示数组内存的上界,实参n表示被访问的数组元素的下标,实参sizeof(int)表示被访问的数组元素的大小,函数PRFcheck_dpc_ss用于检测数组下标表达式是否存在越界访问错误;
(b2)对于外部数组声明“extern int arr[]”,为该数组内存定义一个足够大的上界(unsigned)-1,对数组下标表达式“arr[n]”进行插桩后的结果如下:
arr[PRFcheck_dpc_ss(arr,(char*)arr+((unsigned)-1),arr,n,sizeof(int))]
其中,(char*)arr表示将数组内存的下界转化为字符指针类型的值;
(b3)对于伸缩数组,如果所在结构体的内存空间是通过malloc在堆中分配的空间,那么该数组内存的上界为结构体的上界,对数组下标表达式“ptr-arr[n]”进行插桩后的结果如下:
ptr-arr[PRFcheck_dpc_ss(ptr-arr,get_bound(ptr),ptr-arr,n,sizeof(int))]
其中,ptr是一个指向结构体的指针变量,ptr-arr表示该结构体中的伸缩数组内存的下界,ptr表示指针变量ptr的地址值,函数get_bound用于在运行时通过指针变量地址获取该指针变量所指向内存块的上界;
如果所在结构体的内存空间是通过定义结构体变量而分配的空间,那么该数组内存的上界和下界相同,对数组下标表达式“s.arr[n]”进行插桩后的结果如下:
s.arr[PRFcheck_dpc_ss(s.arr,s.arr,s.arr,n,sizeof(int))]
其中,s是一个结构体变量,s.arr表示该结构体中的伸缩数组内存的下界。
3.根据权利要求1或2所述面向动态分析的源代码插桩改进方法,其特征在于:对匿名结构体的源代码插桩方法包括如下步骤:
(A)对于每个匿名结构体类型定义,为该定义生成一个唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID,并将该新标识符插入该匿名结构体类型定义,作为该结构体类型的名字;
(B)对于每个解引用表达式“*p”,如果被解引用的指针是一个匿名结构体类型的指针或者数组,则构造该匿名结构体类型的唯一标识符ID,并使用ID构造该结构体类型的新标识符struct_ID;
(C)使用标识符struct_ID作为匿名结构体类型的名字,对解引用表达式“*p”进行插桩后的结果如下:
*(struct struct_ID*)PRFcheck_dpv(PRFpmd_tbl_lookup(p),p,sizeof(structstruct_ID))其中,p表示指针变量p的地址值,函数PRFpmd_tbl_lookup用于在运行时通过指针变量地址获取该指针变量所对应的指针元数据,包括该指针变量所指向内存块的下界、上界和有效状态信息,实参p表示解引用表达式所访问内存块的起始地址,实参sizeof(struct struct_ID)表示解引用表达式所访问内存块的大小,函数PRFcheck_dpv用于检测解引用表达式是否存在内存访问错误。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京航空航天大学,未经南京航空航天大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202010539967.2/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种烘焙用智能化节能发酵房
- 下一篇:竞速游戏的信息控制方法、装置和电子设备





