CN101650651B - 一种源代码级别程序结构的可视化方法 - Google Patents
一种源代码级别程序结构的可视化方法 Download PDFInfo
- Publication number
- CN101650651B CN101650651B CN200910152529A CN200910152529A CN101650651B CN 101650651 B CN101650651 B CN 101650651B CN 200910152529 A CN200910152529 A CN 200910152529A CN 200910152529 A CN200910152529 A CN 200910152529A CN 101650651 B CN101650651 B CN 101650651B
- Authority
- CN
- China
- Prior art keywords
- source code
- over
- source
- statement
- index
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 56
- 238000004458 analytical method Methods 0.000 claims abstract description 49
- QTYYIZYAWHBAHQ-UHFFFAOYSA-N 3-(3-amino-2,4,6-trinitrophenyl)-2,4,6-trinitroaniline Chemical compound NC1=C([N+]([O-])=O)C=C([N+]([O-])=O)C(C=2C(=C(N)C(=CC=2[N+]([O-])=O)[N+]([O-])=O)[N+]([O-])=O)=C1[N+]([O-])=O QTYYIZYAWHBAHQ-UHFFFAOYSA-N 0.000 claims description 12
- 230000000007 visual effect Effects 0.000 claims description 6
- 238000012163 sequencing technique Methods 0.000 claims description 5
- 238000002203 pretreatment Methods 0.000 claims description 4
- 238000012545 processing Methods 0.000 claims description 4
- 238000013519 translation Methods 0.000 claims description 4
- 238000003379 elimination reaction Methods 0.000 claims description 3
- 238000004321 preservation Methods 0.000 claims description 3
- 238000006243 chemical reaction Methods 0.000 claims description 2
- 238000012217 deletion Methods 0.000 claims description 2
- 230000037430 deletion Effects 0.000 claims description 2
- 230000008030 elimination Effects 0.000 claims description 2
- 230000006870 function Effects 0.000 abstract description 54
- KRTSDMXIXPKRQR-AATRIKPKSA-N monocrotophos Chemical compound CNC(=O)\C=C(/C)OP(=O)(OC)OC KRTSDMXIXPKRQR-AATRIKPKSA-N 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 11
- KDYFGRWQOYBRFD-UHFFFAOYSA-N succinic acid Chemical compound OC(=O)CCC(O)=O KDYFGRWQOYBRFD-UHFFFAOYSA-N 0.000 description 10
- 238000005206 flow analysis Methods 0.000 description 5
- 101100534231 Xenopus laevis src-b gene Proteins 0.000 description 4
- 230000008520 organization Effects 0.000 description 3
- 241000238876 Acari Species 0.000 description 2
- DKMVJQCQTCLYIF-UHFFFAOYSA-M Methylbenactyzium bromide Chemical compound [Br-].C=1C=CC=CC=1C(O)(C(=O)OCC[N+](C)(CC)CC)C1=CC=CC=C1 DKMVJQCQTCLYIF-UHFFFAOYSA-M 0.000 description 2
- 238000007630 basic procedure Methods 0.000 description 2
- 230000002950 deficient Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 101100058681 Drosophila melanogaster Btk29A gene Proteins 0.000 description 1
- 101100496858 Mus musculus Colec12 gene Proteins 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000002224 dissection Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000012800 visualization Methods 0.000 description 1
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种源代码级别程序结构的可视化方法,该方法可以对不同编程语言编写的源代码的词法、语法、语义分析,并能够深层次剖析程序结构,以图形化的形式在源代码级别将各种分析结构,诸如函数调用图、控制流图、数据流图、强连通区域、支配树等信息显示出来;本发明提出的方法和传统的针对具体编程语言、仅显示控制流的可视化方法相比具有更好的通用性、扩展性以及更为强大的程序结构剖析能力。
Description
技术领域
本发明属于计算机技术领域,涉及源代码级别程序结构的可视化方法,尤其涉及一种对编译器产生的中间表达式所携带的调试信息进行分析,并在源代码级别将程序结构以图形化的形式显示出来的实现方法。
背景技术
程序结构的可视化方法是指将程序内部的逻辑结构以图形的方式显示出来。程序的逻辑结构主要包括两类:控制关系和数据关系。控制关系主要是指函数内部的控制流图以及函数间的调用关系,数据关系主要是指函数内部的数据流图。程序结构的可视化方法能够将程序的逻辑结构以图形这种直观的方式展现出来,有助于开发人员了解程序结构,降低问题的分析难度,提高开发效率。目前的程序结构可视化方法主要是针对某一种具体的编程语言(比如Java,C,C++等),对其源代码进行语义分析,特别是确定函数边界,条件分支和循环语句,然后根据这些影响控制流的语句确定源代码中基本块的范围以及基本块之间的控制依赖关系,并最终以图形的形式将这种控制依赖关系表达出来。该方法的缺陷有三点:1.不具备通用性,如果分析目标使用不同的编程语言编写,那么必须开发针对不同语言的分析工具,导致开发成本升高。2.功能单一,只能显示程序的控制关系,由于无法利用编译器的分析结果导致无法深入显示程序的内部结构。此外,目前编译器的分析结果一般是以中间表达式(Intermediate Representation,简称IR)或者文字输出的形式进行描述的,这增加了非编译器专业人士理解分析结果的难度。
发明内容
本发明的目的是针对上述传统程序可视化方法的缺陷,提供一种源代码级别程序结构的可视化方法。该方法并不局限于单一的编程语言,能够使用统一的方式处理多种不同类型编程语言编写的代码。其基本实现方法是使用编译器前端在加入调试信息的前提下对源代码进行编译,将不同编程语言编写的源代码转化为编译器定义的IR。然后对包含调试信息的IR进行分析以确定IR与源代码之间对应关系,并以此为基础利用编译器的分析功能产生由IR表述的程序结构分析结果,之后将该结果转化为源代码表述的图形描述文件。图形描述文件的格式为Graphviz(Graph Visualization Software,http://www.graphviz.org/)定义的dot文件格式。最后利用Graphviz中的dot工具将图形描述文件转化为一定格式的图片,比如jpg、png等。编译器(比如gcc等)可以进行控制流、过程内数据流,过程间调用关系等等多种形式的分析,本发明可以对满足基于数据结构中定义的图结构要求的编译器分析结果进行可视化。
本发明的目的是这样达到的:一种对调试信息进行解析确定IR和源代码之间的映射关系并以图形化的形式显示程序结构的方法,其具体特征是:在编译器模块(Compiler Module,简称CM),源代码管理器模块(Source Code ManagerModule,简称SCMM),调试信息处理器模块(Debug Information ProcessorModule,简称DIPM),图形生成器模块(Graph Generator Module,简称GGM)这四个模块中完成对源代码程序结构的图形化显示。其基本步骤是:
步骤1)产生目标文件OBJ
使用CM在加入产生调试信息选项的条件下编译待处理的源代码,产生IR形式的目标文件OBJ。该步骤的目的在于利用编译器将各种使用不同语言编写的源代码转化为CM定义的统一IR形式,有助于提高本方法的通用性;同时完成了词法、语法和语义分析,有助于利用编译器对程序结构深入剖析。
步骤2)解析配置文件
读取配置文件,设置影响后续步骤的参数,主要包括确定待分析的函数列表以及产生的可视化图形文件的属性。步骤1和步骤2均完成后转入步骤3。
步骤3)建立源代码查找表
启动源代码管理器模块SCMM,建立源代码查找表(Source CodeLookup-Table,简称SCLT),以保存OBJ中的IR代码和源代码之间的对应关系。
步骤4)产生可视化的程序分析结果
运行图形生成器模块GGM,产生程序结构的可视化图形文件。其基本过程为首先由CM对FuncList中的各函数进行用户要求的程序结构分析。然后由GGM驱动DIPM利用SCLT中的信息将分析结果转化源代码形式的图模型,并最终产生可视化的图形文件。
本发明的有益效果是,本方法基于已有的编译器模块,能够良好的利用编译器前端将其所支持的各种不同的编程语言转化为统一的中间表达式,然后对中间表达式进行处理,无须针对不同的编程语言编写不同的分析工具。此外,本方法可以结合编译器自带的分析功能,将各种满足图结构的分析结果转化为源代码级别的可视化形式。这有助于帮助普通不具有编译器专业背景的程序开发人员直观地了解代码的结构。本发明提出的方法和传统的针对具体编程语言、仅显示控制流的可视化方法相比具有更好的通用性、扩展性以及更为强大的程序结构剖析能力。
附图说明
图1是本发明方法处理过程的流程图;
图2是CM的流程图;
图3是配置文件示例说明图;
图4是SCMM的流程图;
图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,以及最终产生的图形文件。每个步骤具体实现细节如下所示:
步骤1)产生目标文件OBJ
本步骤的实现是由编译器模块CM实现的。
CM的目的在于:将待处理的源代码转化为具有统一IR格式的目标文件OBJ,同时能够接收GGM的调用根据用户要求进行对应的程序结构分析。CM包括以下功能:词法分析,语法分析,语义分析,中间代码生成,程序结构分析。其基本作用有两个:1.将源代码转化为IR;2.在IR级别分析程序结构,包括控制流分析、函数调用图分析、过程内数据流分析、过程间数据流分析、强连通区域确定以及支配树(Dominator Tree)的产生等。CM可以使用已有的成熟编译器系统,比如gcc、llvm(Low Level Virtual Machine,http://llvm.org/)等。
使用CM对源代码编译时,需要加入调试选项,其运行的基本过程为:首先分别编译单个源文件产生对应的目标文件,然后将生成的多个目标文件在禁止优化的条件下链接为一个目标文件OBJ,最后在GGM模块中能够按照用户需求对OBJ进行程序结构分析并以IR的形式保存。CM的流程如图2所示。兹以llvm(2.5版本)为例,说明本步骤中对若干C源文件进行处理的过程:
●C语言编写的源代码由三个源文件实现:src1.c src2.csrc3.c●使用llvm-gcc分别编译这三个源文件,分别产生携带调试信息的目标文件■llvm-gcc -g- emit-llvm src1.c -c -o src1.bc■llvm-gcc -g- emit-llvm src2.c -c -o src2.bc■llvm-gcc -g- emit-llvm src3.c -c -o src3.bc●在禁止优化的条件下将三个目标文件srcl.bc,src2.bc,src3.bc链接为一个目标文件OBJ■llvm-ld --disable-opt src1.bc src2.bc src3.bc-o OBJ |
步骤2)解析配置文件
读取配置文件,设置影响后续步骤的参数FuncList,GraphAttr。该配置文件包含两方面的内容:1.所要分析的函数列表,保存在FuncList中;2.对分析结果进行描述的图形的属性,保存在GraphAttr中。FuncList,GraphAttr。FuncList中的元素为字符串形式的函数名称,其元素个数用FuncList.size表示。 FuncList[i]表示FuncList中第i个函数名称。GraphAttr的结构如下所示,共包含五个元素:
给定GraphAttr, 令GraphAttr.e表示GraphAttr所含的元素e。配置文件的格式如下所示:
①注释符号,用‘#’表示。配置文件中的任意一行内容如果以‘#’起始,那么该行的所有内容均被视为注释,不以考虑;否则均视为用户定义的配置内容。
②数据域起始标记,表示配置文件中不同的数据配置区域。其包括两种类型:1.函数列表起始标记,用‘**Function List**’表示。2.图形属性起始标记,用‘**Graph Attributes**’。数据域起始标记必须单独占据一行。
③函数列表配置区域。该区域始于函数列表起始标记,终止于图形属性起始标记。每行为一个待处理的函数名称,以字符串的形式出现。若不指定待处理的函数列表,则默认处理源代码中所有用户定义的函数
④图形属性配置区域。该区域始于图形属性起始标记,终止于配置文件结尾。图形各项属性的配置格式如下所示:
NodeShape=shape
NodeStyle=nstyle
NodeColor=ncolor
EdgeStyle=estyle
EdgeColor=ecolor
shape:可以选择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,FuncList[0]为main;GraphAttr.NodeShape为box,GraphAttr.NodeStyle为filled,GraphAttr.NodeColor为grey,GraphAttr.EdgeStyle为dotted,GraphAttr.EdgeColor为red。
步骤3)建立源代码查找表
本步骤由源代码管理器模块SCMM完成。SCMM的主要功能有两个:1、分析OBJ包含的调试信息,确定IR语句和源代码语句的对应关系,并保存在SCLT中;2、给定OBJ中的任何一条IR语句,通过查询SCLT反馈与之对应的源代码语句。SCLT的建立主要依赖于OBJ中IR形式调试信息的分析,确定每条IR语句所对应的源代码语句所在的目录、文件、行号以及对应的字符串形式的源代码语句,然后将这种对应关系保存在SCLT中。查询与反馈则完全基于SCLT数据结构的查找操作。SCMM的流程如图4所示。
SCMM建立源代码查找表SCLT的基本过程为,分析目标文件OBJ,依次处理FuncList中的各个函数,解析函数定义区域中由编译器加入的调试语句,获取与该函数相对应的源代码信息。然后对源代码所在的源文件进行分析,确定该源文件的名称、目录名和代码内容等信息,并将其保存在SCLT中。SCLT的结构如下所示:
给定函数名称FuncName,SCR用于保存FuncName所代表函数被定义处所在的源文件SourceFile的信息。SCR主要包括两部分数据模块:1.以字符串形式保存的标签Tag,Tag由以字符串形式保存的SourceFile所在目录的绝对路径(Source File Path,简称SFP)和以字符串形式保存的SourceFile的名称(Source File Name,简称SFN)串联组成,即Tag=SFP+SFN;2.SourceFile内部的代码序列(Code Sequence,简称CS),令SourceFile中的行数为LineNo,那么CS中的元素个数为LineNo。 CS[i]代表CS中的第i+1个元素,也就是以字符串形式保存的SourceFile中的第i+1行代码。给定SCR,其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初始化为0。转入步骤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语句。令DebugInst表示第一条携带该信息的IR语句,若找不到则令DebugInst为空。若DebugInst为空,报错并输出信息说明无法获取指定函数FuncList[index]对应的源代码信息,然后转入步骤3.7;否则转入步骤3.4。
3.4)按照IR的语法规范解析DebugInst,获取其中有关函数FuncList[index]被定义处所在源文件的名称Name和路径Path,令tmpTag=Path+Name。若SCLT的SCR集合中并没有一个SCR满足其标签等于tmpTag,即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+1。转入步骤3.2。
3.8)步骤3结束。
步骤4)产生可视化的程序分析结果
本步骤由图形生成器模块GGM完成。GGM调用CM对OBJ进行用户要求的程序结构分析,并将IR形式的分析结果通过DIPM转化为源代码级别的图结构,最后通过冗余语句、空节点消除操作产生经过完善的源代码级别的可视化图形文件。
DIPM的主要功能是为GGM提供一个语句转换接口,通过SCMM提供的查询功能将每个基本块内部的IR语句序列转化为与之对应的源代码语句序列。DIPM的流程图将在下文GGM的具体实现步骤中进行介绍。
GGM的基本流程如图6所示,共包括以下七个子步骤:
4.1)调用编译器模块CM按照用户指定的程序结构分析操作,依次处理FuncList中指定的待分析函数,并以IR或者字符串(比如函数调用图)的形式记录分析的结果。分析结果按照分析的先后顺序保存在ResultSet中,ResultSet中的元素个数为FuncList.size, ResultSet[i]代表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中产生的分析结果Rcur转化为GGM定义的图模形,记为Ginitial。GGM的图模型定义如下所示:
若Rcur为函数调用图的分析结果,那么Ginitial中各节点的内容为字符串,用于表示函数名称,否则各节点内容为IR用于记录程序中的各条指令与符号。若Rcur不符合GGM图模型的定义,那么报错说明CM产生的分析结果无法以图的形式显示,然后转入步骤4.7;否则转入步骤4.4。
4.4)建立源代码级别的初始图模型Gsource。若Gintial中各节点的内容为字符串,令Gsource模型与Ginitial完全一致,然后转入步骤4.5。否则在维持Ginitial拓扑结构不变的条件下,遍历Ginitial中的各个节点。令Vertex表示当前处理的节点,按照Vertex中IR语句出现的先后顺序依次处理:令IRInst表示当前处理的IR语句,利用DIPM提供的语句转换接口将IRInst转化为对应源代码语句,用S表示。若S与IRInst的上一条IR语句转化后的源代码语句不同,那么将IRInst替换为S,否则将IRInst从Vertex中删除然后处理下一条IR语句。完成所有节点的处理后,产生的图模型记为Gsource。转入步骤4.5。提供语句转换接口的DIPM流程如图7所示,其具体实现步骤如下所示:
a.令Inst表示当前待处理的IR语句。令DebugInst表示携带调试信息的IR语句,将DebugInst置为空。令BBInst表示Inst所处的基本块BB的首条语句。转入b。
b.若BBInst等于Inst,转入e;否则,若DebugInst为空转入f,若DebugInst非空转入c。
c.解析DebugInst,获取对应的源文件名称Name,路径Path和行号LineNo。令tmpTag=Path+Name,令FuncName表示Inst所处的函数的名称,令tmpSCR=SCLT[FuncName].Base。若tmpSCR为空,或者tmpSCR.CS[LineNo]为空,转入f;否则转入d。
d.返回tmpSCR.CS[LineNo]。
e.若BBInst包含调试信息,令DebugInst=BBInst。若BBInst是BB的最后一条语句,那么转入f;否则令BBInst等于BB内当前语句的下一条语句,即BBInst的下一条语句,转入b。
f.返回空字符串。
4.5)对步骤4.4生成的Gsource进行修订,以便使分析结果更加清晰、美观:首先删除Gsource各节点所包含的冗余语句,然后删除不含冗余语句的Gsource中的空节点。消除冗余语句的处理流程如图8所示,其具体实现步骤如下所示:
a.令Vertex表示待处理的目标图模型Graph的根节点,也就是Gsource的根节点。转入b。
b.若Vertex不为空,且Vertex有后继节点,那么令Succ表示Vertex的首个后继节点,令STCur表示Vertex中的最后一条语句,令STSuc表示Succ中的首条语句,然后转入c;若Vertex为空或没有后继节点,则转入j。
c.若STCur是函数返回语句(比如Java,C,C++语言中的return语句),转入d。若STCur非函数返回语句,那么若STCur不等于STSuc,转入i;否则若STCur是for循环控制语句,转入h,否则转入e。
d.若Succ只有一条语句且STSuc为函数返回语句,那么将Succ包含的所有语句清空。转入i。
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-First Search)顺序的下一个未处理的节点,转入b。
k.消除冗余语句的处理流程结束。
Gsource消除冗余语句后需要进一步消除空节点,并移除空节点消除过程中产生的新的冗余语句。消除空节点的处理流程如图9所示,其具体实现步骤如下所示:
a.令Vertex表示待处理的目标图模型Graph的根节点,即消除冗余节点后的Gsource。转入b。
b.获取Vertex的所有后继节点,并保存在SuccSet中。获取Vertex的所有先驱节点,并保存在PredSet中。若Vertex不为空,转入c;否则向Graph中添加边,使得Vertex的所有后继节点成为Vertex每个先驱节点的新后继节点,然后从Graph中移除Vertex及其各条入边和出边,最后将Graph中的所有节点标记为未处理,并转入a。
c.若Vertex只有一个后继SuccSet[0],且满足Vertex==SuccSet[0],那么移除SuccSet[0]包含的所有语句,然后将Graph中的所有节点标记为未处理,并转入a;否则转入d。
d.若Vertex是Graph中最后一个被处理的节点,那么转入e;否则令Vertex表示Graph按照宽度优先遍历顺序的下一个未被处理的节点,转入b。
e.消除冗余节点的处理流程结束。
经过冗余语句消除和空节点消除后产生的图模型记为Gfinal。转入步骤4.6。
4.6)将Gfinal转化为GRAPHVIZ的dot文件格式。dot文件格式在Graphviz的官方文档中有详细介绍,本发明不再赘述。此处需要说明的是,dot文件中,每个节点与Gfinal中的节点相对应,节点的标签label为Gfinal对应节点所包含的各条源代码语句按照先后顺序串行排列所得到的字符串。每个节点的属性应按照GraphAttr中的节点属性进行设置,即节点的形状设置为NodeShape,节点的填充类型设置为NodeStyle,节点的填充颜色设置为NodeColor。dot文件中节点之间的有向边与Gfinal中的有向边相对应,边的属性应按照GraphAttr中的边属性进行设置,即边的显示类型设置为EdgeStyle,边的颜色设置为EdgeColor。然后利用GRAPHVIZ中的dot工具将dot文件转化为图形格式。如图10所示,图10(b)为针对图10(a)所示的C语言编写的函数list_equal进行控制流分析后的图形结果。令index=index+1,转入步骤4.2。
4.7)整个处理过程结束。
上述内容所举实例仅是为了方便说明而举例,本发明所主张的权利范围自应以申请专利范围所述为准,而非仅限于上述实施例。
Claims (3)
1.一种源代码级别程序结构的可视化方法,系统包括编译器模块CM、源代码管理器模块SCMM、调试信息处理器模块DIPM和图形生成器模块GGM;其特征在于,该方法包括以下步骤:
(1)产生目标文件OBJ:编译器模块CM在加入产生调试信息选项的条件下编译待处理的源代码,产生IR形式的目标文件OBJ;
(2)解析配置文件:读取配置文件,设置影响后续步骤的参数FuncList、GraphAttr,确定待分析的函数列表以及产生的可视化图形文件的属性;该配置文件包含两方面的内容:其一为所要分析的函数列表,保存在FuncList中;其二为对分析结果进行描述的图形的属性,保存在GraphAttr中;
(3)建立源代码查找表SCLT:启动源代码管理器模块SCMM,建立源代码查找表SCLT,以保存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语句,若找不到则令DebugInst为空;若DebugInst为空,报错并输出信息说明无法获取指定函数FuncList[index]对应的源代码信息,然后转入步骤(3.7);否则转入步骤(3.4);
(3.4)按照IR的语法规范解析DebugInst,获取其中有关函数FuncList[index]被定义处所在源文件的名称Name和路径Path,令tmpTag=Path+Name;若源代码查找表SCLT的源代码仓库SCR集合中并没有一个源代码仓库SCR满足该源代码仓库SCR的标签等于tmpTag,即tmpTag.Base为空,转入步骤(3.5),否则转入步骤(3.7);
(3.5)建立新的源代码仓库SCR,令源代码仓库的Tag数据模块SCR.Tag=tmpTag;若tmpTag所指的文件SourceFile可以正常打开,转入步骤
(3.6);否则报错且输出信息说明无法打开指定的源文件,转入步骤(3.7);
(3.6)按行依次读取SourceFile的信息,将第i行代码以字符串的形式保存在SCR.CS[i-1]中;令LineNo表示SourceFile中的行数,那么读取完SourceFile中的所有信息后,源代码仓库的CS数据模块SCR.CS中的元素个数为LineNo;然后将SCR添加至源代码查找表SCLT的源代码仓库集合中,转入步骤(3.7);
(3.7)index自加1,即index=index+1;转入步骤(3.2);
(3.8)步骤(3)结束。
3.根据权利要求1所述源代码级别程序结构的可视化方法,其特征在于,所述步骤(4)具体为:
(4.1)调用编译器模块CM按照用户指定的程序结构分析操作,依次处理FuncList中指定的待分析函数,并以IR或者字符串的形式记录分析的结果;分析结果按照分析的先后顺序保存在ResultSet中,ResultSet中的元素个数为FuncList.size,,ResultSet[i]代表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)中产生的分析结果Rcur转化为GGM定义的图模形,记为Ginitial;若Rcur为函数调用图的分析结果,那么Ginitial中各节点的内容为字符串,用于表示函数名称,否则各节点内容为IR用于记录程序中的各条指令与符号;若Rcur不符合GGM图模型的定义,那么报错说明CM产生的分析结果无法以图的形式显示,然后转入步骤(4.7);否则转入步骤(4.4);
(4.4)建立源代码级别的初始图模型Gsource;若Gintial中各节点的内容为字符串,令Gsource模型与Ginitial完全一致,然后转入步骤(4.5);否则在维持Ginitial拓扑结构不变的条件下,遍历Ginitial中的各个节点;令Vertex表示当前处理的节点,按照Vertex中IR语句出现的先后顺序依次处理:令IRInst表示当前处理的IR语句,利用DIPM提供的语句转换接口将IRInst转化为对应源代码语句,用S表示;若S与IRInst的上一条IR语句转化后的源代码语句不同,那么将IRInst替换为S,否则将IRInst从Vertex中删除然后处理下一条IR语句;完成所有节点的处理后,产生的图模型记为Gsource;转入步骤(4.5);
(4.5)对步骤4.4生成的Gsource进行修订:首先删除Gsource各节点所包含的冗余语句,然后删除不含冗余语句的Gsource中的空节点;经过冗余语句消除和空节点消除后产生的图模型记为Gfinal;
(4.6)将Gfinal转化为GRAPHVIZ的dot文件格式;
(4.7)整个处理过程结束。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910152529A CN101650651B (zh) | 2009-09-17 | 2009-09-17 | 一种源代码级别程序结构的可视化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200910152529A CN101650651B (zh) | 2009-09-17 | 2009-09-17 | 一种源代码级别程序结构的可视化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101650651A CN101650651A (zh) | 2010-02-17 |
CN101650651B true CN101650651B (zh) | 2012-09-05 |
Family
ID=41672894
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200910152529A Expired - Fee Related CN101650651B (zh) | 2009-09-17 | 2009-09-17 | 一种源代码级别程序结构的可视化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101650651B (zh) |
Families Citing this family (23)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101826013A (zh) * | 2010-03-31 | 2010-09-08 | 北京交通大学 | 一种智能规划系统中操作行为的可视化方法 |
CN102385505B (zh) * | 2010-08-30 | 2013-03-20 | 北京理工大学 | 针对面向对象程序设计语言源代码的软件可视化方法 |
CN101968767A (zh) * | 2010-10-15 | 2011-02-09 | 北京数码大方科技有限公司 | 基于宏程序的代码调试及仿真的方法和装置 |
CN102236574A (zh) * | 2011-06-24 | 2011-11-09 | 浙江工业大学 | 一种可视化表示和解释c/c++语言声明语句的方法 |
CN102662736B (zh) * | 2012-03-09 | 2015-04-22 | 北京思特奇信息技术股份有限公司 | 一种基于系统源代码获取组件调用关系的方法 |
US20130249917A1 (en) * | 2012-03-26 | 2013-09-26 | Microsoft Corporation | Profile data visualization |
CN103729295A (zh) * | 2013-12-31 | 2014-04-16 | 北京理工大学 | 一种污点传播路径分析方法 |
CN105718472B (zh) * | 2014-12-05 | 2019-02-22 | 成都复晓科技有限公司 | 一种表达指标的方法和装置 |
CN104503793A (zh) * | 2014-12-24 | 2015-04-08 | 风腾科技(北京)有限公司 | 代码练习软件中代码的运行和图形化的解析方法 |
CN104536898B (zh) * | 2015-01-19 | 2017-10-31 | 浙江大学 | C程序并行区域的检测方法 |
CN105389194B (zh) * | 2015-10-19 | 2019-02-01 | 华为技术有限公司 | 一种确定应用程序计算逻辑的方法及装置 |
CN107122359B (zh) * | 2016-02-24 | 2020-08-21 | 中移物联网有限公司 | 数据实时跟踪可视化处理方法及装置 |
CN105786509A (zh) * | 2016-02-29 | 2016-07-20 | 浪潮软件集团有限公司 | 一种业务流程图形化展现方法 |
CN107153606A (zh) * | 2016-03-04 | 2017-09-12 | 郭德贵 | 一种程序分析过程可视化方法及系统 |
CN107943481B (zh) * | 2017-05-23 | 2021-01-26 | 清华大学 | 基于多模型的c语言程序代码规范构造方法 |
CN107341021B (zh) * | 2017-07-14 | 2020-05-15 | 中南大学 | 大型复杂软件带约束逻辑属性的软件网络表示、存储与检索方法 |
CN107545174B (zh) * | 2017-08-22 | 2020-03-10 | 武汉大学 | 一种基于llvm的抵御控制流劫持的系统和方法 |
WO2019047218A1 (zh) * | 2017-09-11 | 2019-03-14 | 深圳配天智能技术研究院有限公司 | 一种图形化编程方法、装置、计算机存储介质及视觉系统 |
CN110334302B (zh) * | 2019-05-24 | 2021-09-10 | 北京因特睿软件有限公司 | 复杂Web应用前端运行时分析方法 |
CN110908710B (zh) * | 2019-11-19 | 2023-08-29 | 天津大学 | 一种Web前端代码依赖关系可视化方法 |
CN113448553B (zh) * | 2021-06-23 | 2023-11-03 | 南京大学 | 一种c语言项目依赖信息管理和可视化的方法及系统 |
CN116956236A (zh) * | 2022-04-13 | 2023-10-27 | 堡垒科技有限公司 | 一种去中心化的开源软件可信通证化协议 |
CN115167834B (zh) * | 2022-09-08 | 2022-12-23 | 杭州新中大科技股份有限公司 | 一种基于代码数据化的源代码自动生成方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5313636A (en) * | 1990-09-27 | 1994-05-17 | Intellicorp, Inc. | Mosaic objects and method for optimizing object representation performance in an object-oriented representation system |
CN1446336A (zh) * | 2000-06-16 | 2003-10-01 | 奈克斯维伍技术公司 | 模块化计算机系统以及相关方法 |
CN101196811A (zh) * | 2007-12-07 | 2008-06-11 | 炬才微电子(深圳)有限公司 | 嵌入式软件的开发方法 |
-
2009
- 2009-09-17 CN CN200910152529A patent/CN101650651B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5313636A (en) * | 1990-09-27 | 1994-05-17 | Intellicorp, Inc. | Mosaic objects and method for optimizing object representation performance in an object-oriented representation system |
CN1446336A (zh) * | 2000-06-16 | 2003-10-01 | 奈克斯维伍技术公司 | 模块化计算机系统以及相关方法 |
CN101196811A (zh) * | 2007-12-07 | 2008-06-11 | 炬才微电子(深圳)有限公司 | 嵌入式软件的开发方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101650651A (zh) | 2010-02-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101650651B (zh) | 一种源代码级别程序结构的可视化方法 | |
Cooper et al. | Engineering a compiler | |
McPhillips et al. | YesWorkflow: a user-oriented, language-independent tool for recovering workflow information from scripts | |
Del Fabro et al. | Weaving Models with the Eclipse AMW plugin | |
Brun et al. | Model differences in the eclipse modeling framework | |
US6339776B2 (en) | Dynamic semi-structured repository for mining software and software-related information | |
Costagliola et al. | A framework for modeling and implementing visual notations with applications to software engineering | |
JPH08202545A (ja) | ターゲット言語コードを生成するためのオブジェクト指向システム及びその方法 | |
Daniel et al. | Mogwaï: a framework to handle complex queries on large models | |
US6346945B1 (en) | Method and apparatus for pattern-based flowcharting of source code | |
CA2544392C (en) | Method and system for reversible design tree transformations | |
WO2021253641A1 (zh) | 着色语言翻译方法 | |
US8935657B2 (en) | Model-to-model transformation by kind | |
CN111078217A (zh) | 脑图生成方法、装置和计算机可读存储介质 | |
Costagliola et al. | Positional grammars: a formalism for LR-like parsing of visual languages | |
Zhao et al. | Pattern-based design evolution using graph transformation | |
CN103886095B (zh) | 跨平台目标文件复用方法 | |
Maletic et al. | Leveraging XML technologies in developing program analysis tools | |
US8949710B2 (en) | Grammar and method for integrating XML data from multiple sources | |
Bagge et al. | A pretty good formatting pipeline | |
Cicchetti et al. | Towards propagation of changes by model approximations | |
Nastov et al. | Experimentation of a Graphical Concrete Syntax Generator for Domain Specific Modeling Languages. | |
KR20050065015A (ko) | 프로그램의 복제 여부를 검사하는 방법 및 시스템 | |
Nödler et al. | A flexible framework for quality assurance of software artefacts with applications to Java, UML, and TTCN-3 test specifications | |
Ghica et al. | String Diagrams for $\lambda $-calculi and Functional Computation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120905 Termination date: 20130917 |