一种源代码级别程序结构的可视化方法

文档序号:6579051阅读:1295来源:国知局

专利名称::一种源代码级别程序结构的可视化方法
技术领域
:本发明属于计算机
技术领域
,涉及源代码级别程序结构的可视化方法,尤其涉及一种对编译器产生的中间表达式所携带的调试信息进行分析,并在源代码级别将程序结构以图形化的形式显示出来的实现方法。
背景技术
:程序结构的可视化方法是指将程序内部的逻辑结构以图形的方式显示出来。程序的逻辑结构主要包括两类控制关系和数据关系。控制关系主要是指函数内部的控制流图以及函数间的调用关系,数据关系主要是指函数内部的数据流图。程序结构的可视化方法能够将程序的逻辑结构以图形这种直观的方式展现出来,有助于开发人员了解程序结构,降低问题的分析难度,提高开发效率。目前的程序结构可视化方法主要是针对某一种具体的编程语言(比如Java,C,0++等),对其源代码进行语义分析,特别是确定函数边界,条件分支和循环语句,然后根据这些影响控制流的语句确定源代码中基本块的范围以及基本块之间的控制依赖关系,并最终以图形的形式将这种控制依赖关系表达出来。该方法的缺陷有三点1.不具备通用性,如果分析目标使用不同的编程语言编写,那么必须开发针对不同语言的分析工具,导致开发成本升高。2.功能单一,只能显示程序的控制关系,由于无法利用编译器的分析结果导致无法深入显示程序的内部结构。此外,目前编译器的分析结果一般是以中间表达式(Intermediate^presentation,简称IR)或者文字输出的形式进行描述的,这增加了非编译器专业人士理解分析结果的难度。
发明内容本发明的目的是针对上述传统程序可视化方法的缺陷,提供一种源代码级别程序结构的可视化方法。该方法并不局限于单一的编程语言,能够使用统一的方式处理多种不同类型编程语言编写的代码。其基本实现方法是使用编译器前端在加入调试信息的前提下对源代码进行编译,将不同编程语言编写的源代码转化为编译器定义的IR。然后对包含调试信息的IR进行分析以确定IR与源代码之间对应关系,并以此为基础利用编译器的分析功能产生由IR表述的程序结构分析结果,之后将该结果转化为源代码表述的图形描述文件。图形描述文件的格式为Graphviz(GraphVisualizationSoftware,http:〃www.gr即hviz.org/)定义的dot文件格式。最后利用Graphviz中的dot4工具将图形描述文件转化为一定格式的图片,比如jpg、png等。编译器(比如gcc等)可以进行控制流、过程内数据流,过程间调用关系等等多种形式的分析,本发明可以对满足基于数据结构中定义的图结构要求的编译器分析结果进行可视化。本发明的目的是这样达到的一种对调试信息进行解析确定IR和源代码之间的映射关系并以图形化的形式显示程序结构的方法,其具体特征是在编译器模块(CompilerModule,简称CM),源代码管理器模块(SourceCodeManagerModule,简称SCMM),调试信息处理器模块(DebugInformationProcessorModule,简称DIPM),图形生成器模块(GraphGeneratorModule,简称GGM)这四个模块中完成对源代码程序结构的图形化显示。其基本步骤是-步骤l)产生目标文件OBJ使用CM在加入产生调试信息选项的条件下编译待处理的源代码,产生IR形式的目标文件0BJ。该步骤的目的在于利用编译器将各种使用不同语言编写的源代码转化为CM定义的统一IR形式,有助于提高本方法的通用性;同时完成了词法、语法和语义分析,有助于利用编译器对程序结构深入剖析。步骤2)解析配置文件读取配置文件,设置影响后续步骤的参数,主要包括确定待分析的函数列表以及产生的可视化图形文件的属性。步骤1和步骤2均完成后转入步骤3。步骤3)建立源代码查找表启动源代码管理器模块SCMM,建立源代码査找表(SourceCodeLookup-Table,简称SCLT),以保存OBJ中的IR代码和源代码之间的对应关系。步骤4)产生可视化的程序分析结果运行图形生成器模块GGM,产生程序结构的可视化图形文件。其基本过程为首先由CM对FimcList中的各函数进行用户要求的程序结构分析。然后由GGM驱动DIPM利用SCLT中的信息将分析结果转化源代码形式的图模型,并最终产生可视化的图形文件。本发明的有益效果是,本方法基于已有的编译器模块,能够良好的利用编译器前端将其所支持的各种不同的编程语言转化为统一的中间表达式,然后对中间表达式进行处理,无须针对不同的编程语言编写不同的分析工具。此外,本方法可以结合编译器自带的分析功能,将各种满足图结构的分析结果转化为源代码级别的可视化形式。这有助于帮助普通不具有编译器专业背景的程序开发人员直观地了解代码的结构。本发明提出的方法和传统的针对具体编程语言、仅显示控制流的可视化方法相比具有更好的通用性、扩展性以及更为强大的程序结构剖析能力。图1是本发明方法处理过程的流程图;图2是CM的流程图;图3是配置文件示例说明图;图4是SC画的流程图5是SCMM建立SCLT的流程图6是GGM的流程图7是DIPM的流程图8是消除冗余语句的流程图9是消除空节点的流程图10是控制流分析的可视化结果示例图。具体实施例方式下面结合附图对本发明作进一步的详细说明,本发明的目的和效果将变得更加明显。本发明共包括四个模块编译器模块CM,源代码管理器模块SCMM,调试信息处理器模DIPM,图形生成器模块GGM。本发明提出的方法是利用这四个模块,首先将源代码通过CM转化为IR形式,然后读取配置文件确定用户所要分析的函数列表以及所要产生的图形属性。之后对IR进行分析,启动SCMM解析其中的调试信息,确定IR语句和源代码之间的对应关系。在此基础上,使用CM得到用户指定的IR形式程序结构分析结果。之后启动GGM,利用DIPM将IR形式的分析结果转化为源代码表述的图模型,并最终产生对应的图形文件。图1是本发明提出的源代码级别程序结构可视化方法的处理过程的流程图,其中椭圆表示数据模块,矩形表示具体操作和步骤,菱形表示条件判断。本发明共包括四个步骤,步骤之间的中转数据模块共有七种源代码文件集合,配置文件,CM编译源代码之后产生的目标文件OBJ,分析配置文件得到的函数列表FuncList和图形属性GraphAttr,由SCMM分析源文件建立起来的SCLT,以及最终产生的图形文件。每个步骤具体实现细节如下所示步骤l)产生目标文件OBJ本步骤的实现是由编译器模块CM实现的。CM的目的在于:将待处理的源代码转化为具有统一IR格式的目标文件0BJ,同时能够接收GGM的调用根据用户要求进行对应的程序结构分析。CM包括以下功能词法分析,语法分析,语义分析,中间代码生成,程序结构分析。其基本作用有两个1.将源代码转化为IR;2.在IR级别分析程序结构,包括控制流分析、函数调用图分析、过程内数据流分析、过程间数据流分析、强连通区域确定以及支配树(DominatorTree)的产生等。CM可以使用已有的成熟编译器系统,比女口gcc、llvm(LowLevelVirtualMachine,http://llvm.org/)等。使用CM对源代码编译时,需要加入调试选项,其运行的基本过程为首先分别编译单个源文件产生对应的目标文件,然后将生成的多个目标文件在禁止优化的条件下链接为一个目标文件0BJ,最后在GGM模块中能够按照用户需求对OBJ进行程序结构分析并以IR的形式保存。CM的流程如图2所示。兹以llvni(2.5版本)为例,说明本步骤中对若干C源文件进行处理的过程*C语言编写的源代码由三个源文件实现srcl.csrc2.csrc3.c*使用llvm-gcc分别编译这三个源文件,分别产生携带调试信息的目标文件<table>tableseeoriginaldocumentpage7</column></row><table>步骤2)解析配置文件读取配置文件,设置影响后续步骤的参数FuncList,GraphAttr。该配置文件包含两方面的内容1.所要分析的函数列表,保存在FimcList中;2.对分析结果进行描述的图形的属性,保存在Gr即hAttr中。FuncList,GraphAttr。FuncList中的元素为字符串形式的函数名称,其元素个数用FuncList.size表示。Vie[O,FuncList.size],FuncList[i]表示FuncList中第i个函数名称。GraphAttr的结构如下所示,共包含五个元素<table>tableseeoriginaldocumentpage7</column></row><table>_l格式中定义的各种颜色。_给定GraphAttr,VeeGraphAttr,令GraphAttr.e表示GraphAttr所含的元素e。配置文件的格式如下所示①注释符号,用表示。配置文件中的任意一行内容如果以起始,那么该行的所有内容均被视为注释,不以考虑;否则均视为用户定义的配置内容。②数据域起始标记,表示配置文件中不同的数据配置区域。其包括两种类型1.函数列表起始标记,用'**FunctionList**'表示。2.图形属性起始标记,用'**GraphAttributes**'。数据域起始标记必须单独占据一行。③函数列表配置区域。该区域始于函数列表起始标记,终止于图形属性起始标记。每行为一个待处理的函数名称,以字符串的形式出现。若不指定待处理的函数列表,则默认处理源代码中所有用户定义的函数④图形属性配置区域。该区域始于图形属性起始标记,终止于配置文件结尾。图形各项属性的配置格式如下所示NodeSh即e=shapeNodeStyle二nstyleNodeColor=ncolorEdgeStyle=estyleEdgeColor二ecolorshape:可以选择box,ellipse等dot文件格式中定义的节点形状,默认为box。nstyle:可以选择filled,或者空白。若选择filled则表示节点有背景色填充,默认空白。ncolor:可以选择black,red,yellow等dot文件格式中定义的颜色,默认为黑色(black)。estyle:可以选择dotted,或者空白。若选择dotted则边为虚线,默认为实线。本步骤对配置文件按行扫描进入函数列表配置区域时,每读取一行非注释的字符串S,将S追加至FuncList的末尾;进入图形属性配置区域时,每读取一行非注释的字符串S,S的形式为LABEL=CONTENT(LABEL和CONTENT均为字符串),那么将CONTENT设置为LABEL对应的GraphAttr属性的属性值。兹以图2所示实例说明配置文件的信息读取结果。图2所示的配置文件所包含的信息为用户指定所要处理的函数为main函数,要求生成的图形属性为节点形状为默认值box,节点使用灰色进行填充,边为红色虚线。经过处理FuncList中有且仅有一个元素,FuncList.size为1,FuncUst[O]为main;GraphAttr.NodeSh邵e为box,GraphAttr.NodeStyle为filled,GraphAttr.NodeColor为grey,GraphAttr.EdgeStyle为dotted,GraphAttr.EdgeColor为red。步骤3)建立源代码查找表本步骤由源代码管理器模块SC醒完成。SC醒的主要功能有两个1、分析OBJ包含的调试信息,确定IR语句和源代码语句的对应关系,并保存在SCLT中;2、给定OBJ中的任何一条IR语句,通过查询SCLT反馈与之对应的源代码语句。SCLT的建立主要依赖于OBJ中IR形式调试信息的分析,确定每条IR语句所对应的源代码语句所在的目录、文件、行号以及对应的字符串形式的源代码语句,然后将这种对应关系保存在SCLT中。查询与反馈则完全基于SCLT数据结构的查找操作。SCMM的流程如图4所示。SC醒建立源代码査找表SCLT的基本过程为,分析目标文件OBJ,依次处理FimcList中的各个函数,解析函数定义区域中由编译器加入的调试语句,获取与该函数相对应的源代码信息。然后对源代码所在的源文件进行分析,确定该源文件的名称、目录名和代码内容等信息,并将其保存在SCLT中。SCLT的结构如下所示SCLT的数据结构SCLT的关键字字符串形式的函数名(FuncName)关键字对应的数据信息SCR的标签(Tag)源代码仓库(SourceCodeR印ository,简称SCR)集合SCLT中所有SCR组成的集合给定函数名称FuncName,SCR用于保存FuncName所代表函数被定义处所在的源文件SourceFile的信息。SCR主要包括两部分数据模块1.以字符串形式保存的标签Tag,Tag由以字符串形式保存的SourceFile所在目录的绝对路径(SourceFilePath,简称SFP)和以字符串形式保存的SourceFile的名称(SourceFileName,简称SFN)串联组成,即Tag二SFP+SFN;2.SourceFile内部的代码序列(CodeSequence,简称CS),令SourceFile中的行数为LineNo,那么CS中的元素个数为LineNo。Vie[O,LineNo),CS[i]代表CS中的第i+1个元素,也就是以字符串形式保存的SourceFile中的第i+1行代码。给定SCR,9其Tag数据模块用SCR.Tag表示,CS数据模块用SCR.CS表示;给定一个SCR标签Tag,Tag.Base表示该Tag所对应的SCR,如果SCR集合中并未保存具有Tag的SCR,那么Tag.Base为空。给定函数名称FuncName,SCLT[FuncName]表示FuncName所代表函数对应的SCR的标签Tag。若SCLT中并未保存FuncName的信息,那么SCLT[FuncName]为空,不同的函数可能对应于同一个SCR标签。SCLT[FuncName].Base表示FuncName所代表函数对应的SCR,若不存在则为空。本步骤的基本流程如图5所示,共包括以下八个子步骤3.1)令index表示FuncList中被处理的函数序号,将index初始化为O。转入步骤3.2。3.2)若index等于FuncList.size,转入步骤3.8;否则若函数FuncList[index]不是用户自定义的函数或者SCLT[FuncList[index]]为空,转入步骤3.7,否则转入步骤3.3。3.3)在OBJ中寻找函数FuncList[index]被定义的区域。从定义区域的入口开始依次扫描各条IR语句,寻找携带源代码调试信息的IR语句。令Debuglnst表示第一条携带该信息的IR语句,若找不到则令Debuglnst为空。若Debuglnst为空,报错并输出信息说明无法获取指定函数FuncList[index]对应的源代码信息,然后转入步骤3.7;否则转入步骤3.4。3.4)按照IR的语法规范解析Debuglnst,获取其中有关函数FuncList[index]被定义处所在源文件的名称Name和路径Path,令tmpTag=Path+Name。若SCLT的SCR集合中并没有一个SCR满足其标签等于tmpTag,即t即Tag.Base为空,转入步骤3.5,否则转入步骤3.7。3.5)建立新的源代码仓库SCR,令SCR.Tag二tmpTag。若tmpTag所指的文件SourceFile可以正常打开,转入步骤3.6;否则报错且输出信息说明无法打开指定的源文件,转入步骤3.7。3.6)按行依次读取SourceFile的信息,将第i行代码以字符串的形式保存在SCR.CS[i-l]中。令LineNo表示SourceFile中的行数,那么读取完SourceFile中的所有信息后,SCR.CS中的元素个数为LineNo。然后将SCR添加至SCLT的源代码仓库集合中,转入步骤3.7。3.7)index自加l,即index=index+l。转入步骤3.2。3.8)步骤3结束。步骤4)产生可视化的程序分析结果本步骤由图形生成器模块GGM完成。GGM调用CM对OBJ进行用户要求的程序结构分析,并将IR形式的分析结果通过DIPM转化为源代码级别的图结构,10最后通过冗余语句、空节点消除操作产生经过完善的源代码级别的可视化图形文件。DIPM的主要功能是为GGM提供一个语句转换接口,通过SCMM提供的查询功能将每个基本块内部的IR语句序列转化为与之对应的源代码语句序列。DIPM的流程图将在下文GGM的具体实现步骤中进行介绍。GGM的基本流程如图6所示,共包括以下七个子步骤-4.1)调用编译器模块CM按照用户指定的程序结构分析操作,依次处理FimcList中指定的待分析函数,并以IR或者字符串(比如函数调用图)的形式记录分析的结果。分析结果按照分析的先后顺序保存在ResultSet中,ResultSet中的元素个数为FuncList.size,Vie代表ResultSet中的第i+1个元素,即FimcList中第i+1个函数的分析结果。令index二0,然后转入步骤4.2。4.2)若index不等于FuncList.size,令Rcur=ResultSet[index],转入步骤4.3;否则转入步骤4.7。4.3)将步骤4.2中产生的分析结果R。ur转化为GGM定义的图模形,记为Ginitial。GGM的图模型定义如下所示GGM图模型定义*GGM的图模型用G(V,E)表示,其中V表示节点集合,E表示有向边集合。*V,节点集合。任给veV,v必须满足l.v是串行序列结构,v中元素的排列顺序为这些元素加入v的先后顺序;2.v中的元素必须类型相同或者均为IR语句,或者均为源代码中表示特定符号的字符串。如果节点中不包含任何IR语句或字符串,则称该节点为空。Wl,v2eV,如果vl和v2中的语句数量、顺序及内容完全相同,则vl与v2相同,记为vl==v2。没有前驱的节点称为根节点,没有后继的节点称为叶子。*E,有向边集合。任给eeE,e必须满足1.e的起点和终点必须连接相应的节点,起点连接的节点称为终点连接节点的前驱,终点连接的节点称为起点连接节点的后继;2.e必须体现前驱和后继之间一定的逻辑关系,比如控制流、数据流关系等等。*G(V,E)在遍历过程中对每个节点的处理必须保证任何一个节点被处理且仅处理一次,除非特别声在遍历前明将G(V,E)中各节点标记为未处理。若Rw为函数调用图的分析结果,那么Ginitw中各节点的内容为字符串,用于表示函数名称,否则各节点内容为IR用于记录程序中的各条指令与符号。若R^不符合GGM图模型的定义,那么报错说明CM产生的分析结果无法以图的形式显示,然后转入步骤4.7;否则转入步骤4.4。4.4)建立源代码级别的初始图模型Gs。_。若Gintw中各节点的内容为字符串,令Gs。^模型与GiM^完全一致,然后转入步骤4.5。否则在维持Gw^拓扑结构不变的条件下,遍历G^w中的各个节点。令Vertex表示当前处理的节点,按照Vertex中IR语句出现的先后顺序依次处理令IRInst表示当前处理的IR语句,利用DIPM提供的语句转换接口将IRInst转化为对应源代码语句,用S表示。若S与IRInst的上一条IR语句转化后的源代码语句不同,那么将IRInst替换为S,否则将IRInst从Vertex中删除然后处理下一条IR语句。完成所有节点的处理后,产生的图模型记为Gs。_。转入步骤4.5。提供语句转换接口的DIPM流程如图7所示,其具体实现步骤如下所示a.令Inst表示当前待处理的IR语句。令Debuglnst表示携带调试信息的IR语句,将Debuglnst置为空。令BBInst表示Inst所处的基本块BB的首条语句。转入b。b.若^BBInst等于Inst,转入e;否则,若Debuglnst为空转入f,若Debuglnst非空转入c。c.解析Debuglnst,获取对应的源文件名称Name,路径Path和行号LineNo。令tmpTag=Path+Name,令FuncName表示Inst所处的函数的名称,令tmpSCR=SCLT[FuncName].Base。若tmpSCR为空,或者tmpSCR.CS[LineNo]为空,转入f;否则转入d。d.返回tmpSCR.CS[LineNo]。e.若BBInst包含调试信息,令Debuglnst二BBInst。若BBInst是BB的最后一条语句,那么转入f;否则令BBInst等于BB内当前语句的下一条语句,即BBInst的下一条语句,转入b。f.返回空字符串。4.5)对步骤4.4生成的Gso,进行修订,以便使分析结果更加清晰、美观首先删除G,。e各节点所包含的冗余语句,然后删除不含冗余语句的G,,中的空节点。消除冗余语句的处理流程如图8所示,其具体实现步骤如下所示a.令Vertex表示待处理的目标图模型Graph的根节点,也就是G,e的根节点。转入b。b.若Vertex不为空,且Vertex有后继节点,那么令Succ表示Vertex的首个后继节点,令STCur表示Vertex中的最后一条语句,令STSuc表示Slice中的首条语句,然后转入c;若Vertex为空或没有后继节点,则转入j。c.若STCur是函数返回语句(比如Java,C,0++语言中的return语句),转入d。若STCur非函数返回语句,那么若STCur不等于STSuc,转入i;否则若STCur是for循环控制语句,转入h,否则转入e。d.若Succ只有一条语句且STSuc为函数返回语句,那么将Succ包含的所e.若STCur是while循环控制语句,将STSuc从Succ中清除。转入f。f.若STCur是断言assert语句,将STSuc改为assert—failure。转入g。g.若STCur是判断语句if,且Vertex是Succ的唯一先驱,将STSuc清除。转入i。h.若Succ有后继,将STCur从Vertex中清除;否则,若Succ所含语句数大于1,将STSuc改为Loop-End,否则将STSuc改为Return。转入i。i.若Succ是Vertex最后一个被处理的后继节点,转入j;否则令Succ为Vertex下一个未处理的后继节点,转入c。j.若Vertex是Graph最后一个被处理的节点,转入k;否则令Vertex为Graph按照宽度优先遍历(Breadth-FirstSearch)顺序的下一个未处理的节点,转入b。k.消除冗余语句的处理流程结束。Gs。_消除冗余语句后需要进一步消除空节点,并移除空节点消除过程中产生的新的冗余语句。消除空节点的处理流程如图9所示,其具体实现步骤如下所示a.令Vertex表示待处理的目标图模型Graph的根节点,即消除冗余节点后的Gsourceo转入b。b.获取Vertex的所有后继节点,并保存在SuccSet中。获取Vertex的所有先驱节点,并保存在PredSet中。若Vertex不为空,转入c;否则向Graph中添加边,使得Vertex的所有后继节点成为Vertex每个先驱节点的新后继节点,然后从Graph中移除Vertex及其各条入边和出边,最后将Graph中的所有节点标记为未处理,并转入a。c.若Vertex只有一个后继SuccSet[O],且满足Vertex==SuccSet,那么移除SuccSet[O]包含的所有语句,然后将Graph中的所有节点标记为未处理,并转入a;否则转入d。d.若Vertex是Graph中最后一个被处理的节点,那么转入e;否则令Vertex表示Graph按照宽度优先遍历顺序的下一个未被处理的节点,转入b。e.消除冗余节点的处理流程结束。经过冗余语句消除和空节点消除后产生的图模型记为Gfinal。转入步骤4.6。4.6)将Gnw转化为GRAPHVIZ的dot文件格式。dot文件格式在Graphviz的官方文档中有详细介绍,本发明不再赘述。此处需要说明的是,dot文件中,每个节点与Gf中的节点相对应,节点的标签label为Gfw对应节点所包含的各条源代码语句按照先后顺序串行排列所得到的字符串。每个节点的属性应按照GmphAttr中的节点属性进行设置,即节点的形状设置为NodeShape,节点的填充类型设置为NodeStyle,节点的填充颜色设置为NodeColor。dot文件中节点之间的有向边与GfM中的有向边相对应,边的属性应按照GraphAUr中的边属性进行设置,即边的显示类型设置为EdgeStyle,边的颜色设置为EdgeColor。然后利用GRAPHVIZ中的dot工具将dot文件转化为图形格式。如图10所示,图10(b)为针对图10(a)所示的C语言编写的函数list—equal进行控制流分析后的图形结果。令index^index+l,转入步骤4.2。4.7)整个处理过程结束。上述内容所举实例仅是为了方便说明而举例,本发明所主张的权利范围自应以申请专利范围所述为准,而非仅限于上述实施例。1权利要求1、一种源代码级别程序结构的可视化方法,系统包括编译器模块CM、源代码管理器模块SCMM、调试信息处理器模DIPM和图形生成器模块GGM。其特征在于,该方法包括以下步骤(1)产生目标文件OBJ编译器模块CM在加入产生调试信息选项的条件下编译待处理的源代码,产生IR形式的目标文件OBJ。(2)解析配置文件读取配置文件,设置影响后续步骤的参数FuncList、GraphAttr,确定待分析的函数列表以及产生的可视化图形文件的属性。该配置文件包含两方面的内容其一为所要分析的函数列表,保存在FuncList中;其二为对分析结果进行描述的图形的属性,保存在GraphAttr中。(3)建立源代码查找表启动源代码管理器模块SCMM,建立源代码查找表,以保存OBJ中的IR代码和源代码之间的对应关系。(4)产生可视化的程序分析结果运行图形生成器模块GGM,产生程序结构的可视化图形文件。2、根据权利要求1所述源代码级别程序结构的可视化方法,其特征在于,所述步骤(3)具体为(3.1)令index表示FuncList中被处理的函数序号,将index初始化为0。(3.2)若index等于FuncList.size,转入步骤(3.8);否则若函数FuncList[index]不是用户自定义的函数或者SCLT[FuncList[index]]为空,转入步骤(3.7),否则转入步骤(3.3)。(3.3)在OBJ中寻找函数FuncList[index]被定义的区域。从定义区域的入口开始依次扫描各条IR语句,寻找携带源代码调试信息的IR语句。令DebugInst表示第一条携带该信息的IR语句,若找不到则令Debuglnst为空。若Debuglnst为空,报错并输出信息说明无法获取指定函数FuncList[index]对应的源代码信息,然后转入步骤(3.7);否则转入步骤(3.4)。(3.4)按照IR的语法规范解析Debuglnst,获取其中有关函数FuncList[index]被定义处所在源文件的名称Name和路径Path,令tmpTag=Path+Name。若SCLT的SCR集合中并没有一个SCR满足其标签等于t卿Tag,即tmpTag.Base为空,转入步骤(3.5),否则转入步骤(3.7)。(3.5)建立新的源代码仓库SCR,令SCR.Tag=tmpTag。若tmpTag所指的文件SourceFile可以正常打开,转入步骤(3.6);否则报错且输出信息说明无法打开指定的源文件,转入步骤(3.7)。(3.6)按行依次读取SourceFile的信息,将第i行代码以字符串的形式保存在SCR.CS[i-1]中。令LineNo表示SourceFile中的行数,那么读取完SourceFile中的所有信息后,SCR.CS中的元素个数为LineNo。然后将SCR添加至SCLT的源代码仓库集合中,转入步骤(3.7)。(3.7)index自加1,即index=index+l。转入步骤(3.2)。(3.8)步骤(3)结束。3、根据权利要求1所述源代码级别程序结构的可视化方法,其特征在于,所述步骤(4)具体为(4.1)调用编译器模块CM按照用户指定的程序结构分析操作,依次处理FimcList中指定的待分析函数,并以IR或者字符串的形式记录分析的结果。分析结果按照分析的先后顺序保存在ResultSet中,ResultSet中的元素个数为FuncList.size,Vie代表ResultSet中的第i+1个元素,即FuncList中第i+1个函数的分析结果。令index=0,然后转入步骤(4.2)。(4.2)若index不等于FuncList.size,令Rcur=ResultSet[index],转入步骤(4.3);否则转入步骤(4.7)。(4.3)将步骤(4.2)中产生的分析结果R。ur转化为GGM定义的图模形,记为Ginitw。若R^为函数调用图的分析结果,那么Gi^冲各节点的内容为字符串,用于表示函数名称,否则各节点内容为IR用于记录程序中的各条指令与符号。若R,不符合GGM图模型的定义,那么报错说明CM产生的分析结果无法以图的形式显示,然后转入步骤(4.7);否则转入步骤(4.4)。(4.4)建立源代码级别的初始图模型Gs。^。若Gintw中各节点的内容为字符串,令Gs。咖e模型与Gw完全一致,然后转入步骤(4.5)。否则在维持G威w拓扑结构不变的条件下,遍历Ginitw中的各个节点。令Vertex表示当前处理的节点,按照Vertex中IR语句出现的先后顺序依次处理令IRInst表示当前处理的IR语句,利用DIPM提供的语句转换接口将IRInst转化为对应源代码语句,用S表示。若S与IRInst的上一条IR语句转化后的源代码语句不同,那么将IRInst替换为S,否则将IRInst从Vertex中删除然后处理下一条IR语句。完成所有节点的处理后,产生的图模型记为G^w。转入步骤(4.5)。(4.5)对步骤4.4生成的Gs。^进行修订,以便使分析结果更加清晰、美观首先删除G^。s各节点所包含的冗余语句,然后删除不含冗余语句的Gs,。e中的空节全文摘要本发明公开了一种源代码级别程序结构的可视化方法,该方法可以对不同编程语言编写的源代码的词法、语法、语义分析,并能够深层次剖析程序结构,以图形化的形式在源代码级别将各种分析结构,诸如函数调用图、控制流图、数据流图、强连通区域、支配树等信息显示出来;本发明提出的方法和传统的针对具体编程语言、仅显示控制流的可视化方法相比具有更好的通用性、扩展性以及更为强大的程序结构剖析能力。文档编号G06F9/44GK101650651SQ200910152529公开日2010年2月17日申请日期2009年9月17日优先权日2009年9月17日发明者册史,姚懿鹏,徐志远,橙李,陶文质申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1