专利名称:一种程序自动查错方法
技术领域:
本发明涉及一种程序自动查错方法,特别涉及对程序中的页错误进行自动查错的方法。
背景技术:
对于嵌入式软件,绝大多数要与硬件直接打交道。根据嵌入式系统的差异,所用处理器也各不相同,有用DSP (Digital Signal Processing数字信号处理)的,有用单片机的。这些处理器的程序或用汇编语言编写,或用高级语言与汇编的混合编写,但是核心部分要用汇编语言编写以提高效率。对于一些DSP和单片机来说,数据区间和程序区间是分页的(也有称为段的),正如早期PC机,每段内存和数据都是64k字节。不同的是DSP和单片机的一页是64或128或其他2的η次方(η为大于O的正整数)个存储单元。以大家熟悉的TI DSP为例,TI C28XX系列是64字为一页,TI C2XX/C24X/24XX是128字为一页。 目前的查错方法一般是使用人工检查,但是人工检查往往费时费力,并且事倍功半,因为即使稍微复杂的系统,程序量也往往会达到上万行、十几万甚至几十万行,人工检查的难度之大可想而知。
发明内容
本发明提供了一种程序自动查错方法和装置,可以自动检查到程序中的页地址错误及无用代码。本发明解决其技术问题所采用的技术方案是一种程序自动查错方法,包括以下步骤
101,读取并分析汇编源程序Y,得到所述汇编源程序Y使用到的全部变量,再生成所述变量和与其对应的页地址的关系列表A ;
102,将所述汇编源程序Y进行预处理,规范汇编源程序Y,使形成一个易于识别和检查的汇编源程序B ;
103,对所述汇编源程序B进行页切换正确性检查,发现并报告页错误。在优选的实施例中,步骤101中,根据特定芯片的语法及其指令来得到所述关系列表Α。在优选的实施例中,所述关系列表A是所述变量与页地址的多对I格式的列表,即一个页地址对应至少一个变量。4、根据权利要求I所述的程序自动查错方法,其特征在于步骤102中,所述预处理包括步骤
401,读取汇编源程序Y;
402,根据特定芯片语法及其指令对所述汇编源程序Y进行初步编译将汇编源程序Y中的宏进行替代,删除注释、无用伪指令。在优选的实施例中,步骤102中,所述预处理是提取所述汇编源程序Y的纯代码,过滤掉无用信息。在优选的实施例中,步骤102中,所述预处理是编译所述汇编源程序Y的宏指令,建立与原来代码文件的关系列表。在优选的实施例中,步骤103中,以顺序结构和跳转分支结构对所述汇编源程序B进行页切换正确性检查。在优选的实施例中,先以顺序结构对所述汇编源程序B进行页切换正确性检查,再以跳转分支结构对所述汇编源程序B进行页切换正确性检查。在优选的实施例中,所述以顺序结构对所述汇编源程 序B进行页切换正确性检查的方法是
901,从所述汇编源程序B开始处读取一条指令;
902,置首次进入子程序或函数的标记为F ;
903,如果是页切换指令,则当前页指向切换后的页地址,同时清标记F即给F标记赋零值;如果不是页切换指令,则执行步骤904 ;
904,如果是变量存取指令,且该变量记为X,则对照所述关系列表找出对应的页地址;如果有首次进入程序标记F,则设当前的页地址为所述变量X的页地址,同时清标记F ;如果没有首次进入程序标记F,则比较变量X的页地址与当前的页地址,如果不相同则标记此处存在页切换错误,如果相同继续读取下一条指令,执行步骤902的动作;如果不是变量存取指令,执行步骤905 ;
905,如果是跳转指令或子程序及函数调用指令,则记录指令中的跳转标号或子程序及函数入口标号,同时记录当前页地址及跳转发生的位置;如果是子程序及函数调用指令,则在其后构造一个标号;如果是绝对跳转指令或子程序及函数调用指令,则做首次进入程序标记F ;如果不是跳转指令或子程序及函数调用指令或绝对跳转指令,执行步骤906 ;
906,如果不是上述所列的指令,则丢弃,并顺序读取下一条指令,执行步骤902。在优选的实施例中,如果在检查某指令或标号时发现有所述标记F首次出现,则将该指令或标号处作为一个子程序入口记录,并记录所述标号后的首次当前页地址的改变情况作为所述子程序标号后页地址,顺序检查所述子程序或函数,到结束时,再将其当时的当前页地址记录为所述子程序的出口页地址。本发明的有益效果是通过本发明,可以快速准确地检查出程序中的页地址错误,还可以检查出程序中的无效代码,并且易于实现。节省了人力,保证开发工作的高效进行。本发明思想适用范围广,可广泛用于所有数据空间或程序空间存在页或段区分的程序的检错。包括具有页/段特性存储空间的DSP处理器,MCU, MPU等芯片的程序的页地址错误检查。
具体实施例方式下面根据具体实施例对本发明作进一步地阐述。本发明方法主要包括三个步骤首先,读取程序Y,根据特定芯片语法及其指令,找出所述程序Y使用到的全部变量,生成变量与页地址的I对I关系列表。所述关系列表A也是所述变量与页地址的多对I格式的列表,即一个页地址对应至少一个变量。然后,重新读取所述程序Y,对其进行预处理使之易于读取、识别和检查,并保持与所述程序Y的对应关系,生成简化版程序B。例如根据特定芯片语法及其指令对所述程序Y进行初步编译将程序Y中的宏进行替代,删除注释、无用伪指令等规范所述程序Y ;或者提取所述程序Y的纯代码,过滤掉无用信息来规范程序;或者编译所述程序Y的宏指令,建立与原来代码文件的关系列表来规范程序。但不限于此,只要所述程序Y变化后,易于识别即属此要素。最后,对所述程序B进行页切换正确性检查,发现并报告页错误。在上述步骤2中,不一定要集中处理以生成程序B,也可以在检查的过程中分散针对每一条程序指令单独进行优化,只要便于读取、识别和检查就可。所述对程序Y进行页切换正确性检查是按程序设计三种基本结构检查(即顺序结构,条件跳转分支结构和循环结构)。其中循环结构可以看作条件跳转结构,子程序及函数调用也可以看作跳转分支结构来对待(但要在子程序及函数调用结束时取得出口页地址)。所以只采取顺序和条件跳转分支两种结构即可完成对所述程序Y的检查。因此在上述步骤3中,是以顺序结构和跳转分支结构对所述程序(B)进行页切换 正确性检查,并且是先以顺序结构对所述程序B进行页切换正确性检查,再以跳转分支结构对所述程序B进行页切换正确性检查。另外需要说明的一点是为便于处理,宏调用或伪指令在生成程序B之前完成。以顺序结构对所述程序B进行页切换正确性检查的方法是从所述程序B开始处读取程序,以标记F标记首次进入程序,以便在稍后的检查中初始化当前页地址。所述标记F只是为说明检查过程使用的一个标志的代号,是在文件头或绝对跳转及子程序、函数返回指令处置位的,表示其后的代码可能是一个子程序或函数的开始。从所述程序Y中顺序读取一条指令;如果读取的指令是页切换指令,则当前页地址指向切换后的页地址,同时清F标记(即给F标记赋零值);如果不是页切换指令,则要判断是否是变量存取指令。如果是变量存取指令,且该变量记为X,则对照所述关系列表找出对应的页地址;如果有首次进入程序标记F,则设当前的页地址为所述变量X的页地址,同时清标记F ;如果没有首次进入程序标记F,则比较变量X的页地址与当前的页地址,如果不相同则标记此处存在页切换错误,如果相同继续读取下一条指令;如果不是变量存取指令,再判断是否是跳转指令或子程序及函数调用指令。如果是跳转指令或子程序及函数调用指令,则指令中必然有一跳转标号或子程序及函数入口标号,记录该标号,同时记录当前页地址及跳转发生的位置,留做后续检测使用(一个标号可以有多个不同的跳入页地址);如果是子程序及函数调用指令,则在其后构造一个标号;如果是绝对跳转指令或子程序及函数调用指令,则做首次进入程序标记F。如果不是跳转指令或子程序及函数调用指令或绝对跳转指令,也不是上述所列的指令,则丢弃,并顺序读取下一条指令,循环执行上述步骤,直到所述程序B结束。上面检查过程中,如果检查到某指令或标号时发现有标记F首次出现,则该程序代码行或标号处即可看做一个子程序入口,做下记录,并记录所述标号后的首次当前页地址的改变情况作为子程序标号后页地址,顺序检测遇到子程序或函数结束时,再将其当时的当前页地址记录为此子程序的出口页地址,可以有多个不同的出口页地址,全部记录下来。一般会有一个标号出现在文件头或跟在绝对跳转指令及子程序或函数返回指令之后。一般来讲,有标号的地方就有可能存在调用指令或跳转指令会使用到该标号,因此就要对比该标号前后的页地址。因为前面调用或跳转过来的页地址已经找到,需要得到该标号后面的页地址的情况。顺序读取所述程序B,读取到标号时,根据有无标记F就可以知道所述标号前有没有绝对跳转指令及函数或子程序返回指令;如果没有标记F,则刚才读到的标号前面与该标号同属一个子程序范围。“所述标号后”指的就是标记F置位后的检查到的第一个标号之后,“所述标号”指的是标记F后的第一个标号,要检查的是首次当前页地址,因为第二次及以上的页地址就不是标号前后检查的范围了。上面检查过程中,每当读取到一个标号时,就对该标号置一个标记Li,表示标号后首个变量存取操作指令及页切换指令需要记录。当顺序检测到页切换指令时,除更新当前页之外,还做记录到标号出口页地址中,包括是否有页切换指令,及切换到哪一页。当顺序检查到变量存取指令,则记录无页切换,并记录所述变量页地址。当顺序检查到跳转,将全部跳转分支(子程序及函数调用看做跳转分支结构)的标号做记 录,然后清除标记Li。反复执行以上步骤,顺序检查,直到程序B结束,
经过上述的检查后,可以得到所述程序Y中的所有标号、跳转到所述标号处的页地址情况以及子程序入口及出口页地址情况。上面已经检查了程序中顺序执行的部分,但没有检查子程序及函数调用后的页切换是否正确,以及跳转到标号时页地址是否正确。检查标号处是否有错误,就要得到其前后页地址的情况。下面介绍如何得到标号后的页地址。和标号的跳入页地址一样,可能有多个不同的页地址转到其他程序分支,也可能只有一个,也可能一个都没有。可以由刚才得到的所有标号的跳出页地址,通过标号置换得到标号后页地址。得到了所有标号的入口及出口页地址后,通过比较每一个标号前后的页地址就可以得出该标号处是否存在页切换错误。具体地以跳转分支结构对所述程序B进行页切换正确性检查的方法包括步骤 首先,将以顺序结构检查完得到的所有标号集合,组成集合E ;
然后,将所述集合E中出口页地址群组进行循环替换,得到所述集合E的出口页地址信息组H,所述信息组H中包含每一个标号后其所有可能分支上的页地址,及每个分支上有无页切换指令;
检查第一个标号的入口页地址及出口页地址,如果所述标号的出口页地址为单个,并且也不是页切换,并且所述标号入口页地址不相同,则报告页错误;如果所述标号的出口页地址为单个、也不是页切换,并且所述标号入口页地址相同,所述标号的出口页地址和入口页地址不相同,也报告页错误。最后,比较每个标号前后的页地址,如果不同则报告页错误。如果标号后的页地址都有页切换指令,则不必考虑跳入标号时页地址是否相同,因为总是对的。对于子程序调用处前后页切换的检查,因为有前面的构造标号,只要将所述构造标号的入口页地址换为对应子程序的出口页地址,然后比较所述子程序调用后的标号前后的页地址,如果不同则报告页错误。本发明所述方法的另一个用途是可以根据每个标号是否都有跳转指令或调用到该标号,同时是否有指令对其标号进行引用,且其前面指令是否为绝对跳转或处在文件头上,就可初步判断出该标号所代表的那段代码是否为无效代码,亦即死代码,并做出报告以供分析。如果没有指令跳转或调用到其处,且没有指令对其标号进行引用,且其前面指令是绝对跳转或处在文件头上,则此段代码为无效代码。“调用该标号”指的是子程序或函数调用到了该标号。“同时是否有指令对其标号进行引用”指的是诸如查表或取标号处程序绝对地址等操作。这也表明有其它的程序在使用所述标号,因此不是无效代码。如果一个标号从来没有地方引用它,它前面又是绝对跳转指令,则该标号将永远不被执行,因此是无效代码,会白白占用程序代码空间。对此方法检查到的页地址错误及无用代码加以纠正及删减,即可实现自动错误纠正及剔除无效代码,保证开发工作的高效进行。本发明易于实现,可以在各种现有流行的计算机操作系统(如Windows系列操作系统,Unix, Linux等)上,利用C,C++,VC, VB等程序设计语言实现。并且发明人已用VB实现,测试验证效果良好,检测4万行汇编代码程序,在DELL 160机器上仅需几分钟,即快速又准确。本设计思想适用范围广,可广泛用于所有数据空间或程序空间存在页或段区分的 程序的检错。包括具有页/段特性存储空间的DSP处理器,MCU, MPU等芯片的程序的页地址错误检查和无效代码检查。以上为本发明的优选实现方式,其描述较为具体和详细,但并不能因此而理解为对发明的限制。在不脱离本发明构思的前提下,所作出的任何变形和改进,均属于本发明的保护范围。
权利要求
1.一种程序自动查错方法,包括以下步骤 ·101,读取并分析汇编源程序Y,得到所述汇编源程序Y使用到的全部变量,再生成所述变量和与其对应的页地址的关系列表A ; ·102,将所述汇编源程序Y进行预处理,规范汇编源程序Y,使形成一个易于识别和检查的汇编源程序B ; ·103,对所述汇编源程序B进行页切换正确性检查,发现并报告页错误。
2.根据权利要求I所述的程序自动查错方法,其特征在于步骤101中,根据特定芯片的语法及其指令来得到所述关系列表A。
3.根据权利要求I所述的程序自动查错方法,其特征在于所述关系列表A是所述变量与页地址的多对I格式的列表,即一个页地址对应至少一个变量。
4.根据权利要求I所述的程序自动查错方法,其特征在于步骤102中,所述预处理包括步骤 ·401,读取汇编源程序Y ; ·402,根据特定芯片语法及其指令对所述汇编源程序Y进行初步编译将汇编源程序Y中的宏进行替代,删除注释、无用伪指令。
5.根据权利要求I所述的程序自动查错方法,其特征在于步骤102中,所述预处理是提取所述汇编源程序Y的纯代码,过滤掉无用信息。
6.根据权利要求I所述的程序自动查错方法,其特征在于步骤102中,所述预处理是编译所述汇编源程序Y的宏指令,建立与原来代码文件的关系列表。
7.根据权利要求I所述的程序自动查错方法,其特征在于步骤103中,以顺序结构和跳转分支结构对所述汇编源程序B进行页切换正确性检查。
8.根据权利要求7所述的程序自动查错方法,其特征在于先以顺序结构对所述汇编源程序B进行页切换正确性检查,再以跳转分支结构对所述汇编源程序B进行页切换正确性检查。
9.根据权利要求8所述的程序自动查错方法,其特征在于所述以顺序结构对所述汇编源程序B进行页切换正确性检查的方法是 ·901,从所述汇编源程序B开始处读取一条指令; ·902,置首次进入子程序或函数的标记为F ; ·903,如果是页切换指令,则当前页指向切换后的页地址,同时清标记F即给F标记赋零值;如果不是页切换指令,则执行步骤904 ; ·904,如果是变量存取指令,且该变量记为X,则对照所述关系列表找出对应的页地址;如果有首次进入程序标记F,则设当前的页地址为所述变量X的页地址,同时清标记F ;如果没有首次进入程序标记F,则比较变量X的页地址与当前的页地址,如果不相同则标记此处存在页切换错误,如果相同继续读取下一条指令,执行步骤902的动作;如果不是变量存取指令,执行步骤905 ; ·905,如果是跳转指令或子程序及函数调用指令,则记录指令中的跳转标号或子程序及函数入口标号,同时记录当前页地址及跳转发生的位置;如果是子程序及函数调用指令,则在其后构造一个标号;如果是绝对跳转指令或子程序及函数调用指令,则做首次进入程序标记F ;如果不是跳转指令或子程序及函数调用指令或绝对跳转指令,执行步骤906 ;. 906,如果不是上述所列的指令,则丢弃,并顺序读取下一条指令,执行步骤902。
10.根据权利要求9所述的程序自动查错方法,其特征在于如果在检查某指令或标号时发现有所述标记F首次出现,则将该指令或标号处作为一个子程序入口记录,并记录所述标号后的首次当前页地址的改变情况作为所述子程序标号后页地址,顺序检查所述子程序或函数,到结束时,再将其当时的当前页地址记录为所述子程序的出口页地址。
全文摘要
本发明涉及一种程序自动查错方法,包括以下步骤101,读取并分析汇编源程序Y,得到所述汇编源程序Y使用到的全部变量,再生成所述变量和与其一一对应的页地址的关系列表A;102,将所述汇编源程序Y进行预处理,规范汇编源程序Y,使形成一个易于识别和检查的汇编源程序B;103,对所述汇编源程序B进行页切换正确性检查,发现并报告页错误。通过本发明,可以快速准确地检查出程序中的页地址错误,还可以检查出程序中的无效代码,并且易于实现。节省了人力,保证开发工作的高效进行。本发明思想适用范围广,可广泛用于所有数据空间或程序空间存在页或段区分的程序的检错。包括具有页/段特性存储空间的DSP处理器,MCU,MPU等芯片的程序的页地址错误检查。
文档编号G06F11/07GK102789402SQ20121022081
公开日2012年11月21日 申请日期2012年6月29日 优先权日2012年6月29日
发明者徐下兵 申请人:徐下兵