本发明属于软件测试,具体涉及一种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和各中断函数。