一种TIC6000系列芯片C/C++裸机程序栈使用分析的方法与流程

文档序号:37475394发布日期:2024-03-28 18:57阅读:10来源:国知局
一种TI C6000系列芯片C/C++裸机程序栈使用分析的方法与流程

本发明属于软件测试,具体涉及一种ti c6000系列芯片c/c++裸机程序栈使用分析的方法。


背景技术:

1、c6000系列芯片是ti公司的一系列高速浮点型dsp芯片,广泛应用于各种工业控制设备。该系列dsp芯片开发时一般使用片内ram,其片内ram较小,例如tms320c6713b只有256kbytes,这必定会限制c/c++程序栈的大小,会极大提高栈溢出的风险。因此c6000系列芯片c/c++裸机程序的栈使用分析就成为软件测试的必要过程。


技术实现思路

1、(一)要解决的技术问题

2、本发明的目的是充分解析ti c6000系列芯片c/c++裸机程序内各函数的调用关系和栈使用信息,以序列化文件和html文件的形式储存,本发明不仅可以直观的展示各函数调用链的栈使用情况,并且可供测试人员进一步充分分析结果。

3、(二)技术方案

4、本发明提出一种ti c6000系列芯片c/c++裸机程序栈使用分析的方法,主要基于java解析out文件实现ti c6000系列芯片c/c++裸机程序函数调用和栈使用情况分析,具体包括如下步骤:

5、步骤1、使用ti集成开发环境编译c/c++裸机程序,生成*.out文件,编写java程序,使用runtime调用ti c6000系列芯片的反汇编工具dis6x,解析*.out文件生成汇编文件*.asm,在java程序中设置顶层函数;

6、步骤2、使用java的bufferedreader按行读取*.asm文件,按空格分解信息字符串,解析到无指令数据的汇编信息时,表明获得label信息或段信息,按行顺序储存入label信息列表中,同时获得当前汇编信息的程序地址、函数名称;解析到存在指令数据的汇编信息时,表明获得汇编指令信息,按空格分解汇编信息,获得当前汇编指令信息的程序地址、指令数据、汇编指令和汇编参数;当汇编指令解析为“.word”时,当前行汇编信息为数据段的数据信息,不再处理此行汇编信息;将解析后的信息按行顺序储存入汇编信息列表中;

7、步骤3、使用java解析label信息列表,跳过无用的段、数据信息、label名称存在“$”字符的label,建立以“程序地址-label”为键值对的地址-label哈希表;按label信息列表顺序,将label存入函数label列表中;各函数label对应的函数的开始地址设置为函数label的程序地址,取下一个函数label、无用的段、数据信息的程序地址减去4即为当前函数label对应的函数的结束地址;

8、步骤4、使用java解析汇编信息列表,解析汇编指令信息对其他函数的调用,解析到“b”指令时,判断到当前汇编指令的汇编参数包含函数label时,按汇编指令信息格式解析出调用函数名称、调用函数程序地址,将“b”指令的程序地址,调用函数地址存入跳转指令列表里;

9、步骤5、使用java解析汇编信息列表,为各函数的栈使用做预处理解析,解析汇编指令信息的汇编指令、汇编参数,解析到“sub”指令时,按“,”分解参数字符串,并替换原汇编参数列表;解析到“stw”指令时,按“,”分解参数字符串,并替换原汇编参数列表;解析到“addk”指令时,按“,”分解参数字符串,并替换原汇编参数列表;

10、步骤6、按函数label列表顺序获取各函数label,在函数label对应的函数的开始地址和结束地址之间,查找属于跳转指令列表的汇编指令,存入当前函数的调用函数列表中;

11、步骤7、按函数label列表顺序获取函数label,在函数label对应的函数前16个汇编指令信息中解析汇编指令、汇编参数,解析到汇编指令为“sub”,并且汇编参数的参数个数为3个时,判断第一个和第三个参数是否为“b15”、第二个参数是否为立即数,判断都为真表明当前汇编指令信息为栈操作指令,第二个参数为栈使用大小;在函数label对应的函数前16个汇编指令信息中解析到“stw”指令,并且判断其参数为2个时,判断第二个参数是否为“*b15--[n]”,n表示立即数,判断为真表明此指令为栈操作指令,第二个参数中的立即数乘以4即为栈使用大小;在函数label对应的函数前16个汇编指令信息中解析到“addk”指令,并且判断其参数为2个时,判断第一个参数是否为负的立即数、第二个参数是否为“b15”,判断都为真表明此指令为栈操作指令,第一个参数改为正数即为栈使用大小;函数label对应的函数解析到栈操作指令后,停止当前函数的汇编指令信息的解析,并将栈使用大小记录在函数中,如果超出16个汇编指令信息、或到达函数结束地址仍未找到栈操作指令,表明此函数无栈操作;

12、步骤8、从各顶层函数开始,深度优先遍历各函数的调用函数列表,形成函数调用树,累加各调用树分支的函数栈大小,当某一分支的调用函数已在此分支已出现过时,停止这一分支的函数调用分析,否则直到无调用函数为止,通过从顶层函数开始的深度优先遍历,形成各顶层函数的调用树和栈信息;将函数调用树和各函数的栈大小序列化,存入文件,以备进一步分析;

13、步骤9、使用java的javax.xml库和org.w3c.dom库,按函数的调用关系和栈累计大小,生成html文件。

14、进一步地,在步骤1中,所述顶层函数包括_main和各中断函数。

15、(三)有益效果

16、与现有技术相比,本发明的有益效果包括:

17、提高分析效率:通过自动化分析,可大大提高分析效率,减少人工分析的时间和成本。

18、提高分析深度:通过解析汇编文件,可更透彻的分析库函数内的调用关系和栈使用情况,更完整的实现程序的栈分析工作。

19、分析结果可读性:使用html文件显式分析结果,可让测试人员快速理解程序中各函数调用链的栈使用情况。

20、提高代码质量:根据分析栈使用情况,合理设计栈大小,避免溢出风险,和资源浪费。

21、可扩展性和夸平台性:java是一种跨平台语言,具有良好的扩展性,可以方便的添加新功能和模块,以适应不断变化的软件测试需求;同时java可直接将解析结果序列化储存为文件,便于数据的进一步分析。



技术特征:

1.一种ti c6000系列芯片c/c++裸机程序栈使用分析的方法,其特征在于,包括如下步骤:

2.根据权利要求1所述的一种ti c6000系列芯片c/c++裸机程序栈使用分析的方法,其特征在于,步骤1中,所述顶层函数包括_main和各中断函数。


技术总结
本发明属于软件测试技术领域,具体涉及一种TI C6000系列芯片C/C++裸机程序栈使用分析的方法,该方法通过使用Java编写程序,调用TI C6000系列芯片的反汇编工具dis6x,解析TI集成开发环境(CCS)生成的out文件,获得C/C++裸机程序的汇编文件;再用Java编写程序,解析汇编文件,获得程序中各函数的调用关系和栈使用大小。将解析后获得函数调用关系和栈使用信息以树结构的方式保存为序列化文件和Html文件,可以使用浏览器或自定义软件查看各函数调用链的栈使用情况。该方法不仅能够提高TI C6000系列芯片C/C++裸机程序的分析效率,而且能够解析并显示C/C++程序中使用的库函数内部的调用关系和栈使用信息,避免设计缺陷,提高代码质量。

技术研发人员:靳少虎,赵丹丹,杨博,王建政,赵娟
受保护的技术使用者:北京计算机技术及应用研究所
技术研发日:
技术公布日:2024/3/27
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1