CN111708572B - 一种基于Clang程序结构的控制流程图自动生成方法 - Google Patents
一种基于Clang程序结构的控制流程图自动生成方法 Download PDFInfo
- Publication number
- CN111708572B CN111708572B CN202010428445.5A CN202010428445A CN111708572B CN 111708572 B CN111708572 B CN 111708572B CN 202010428445 A CN202010428445 A CN 202010428445A CN 111708572 B CN111708572 B CN 111708572B
- Authority
- CN
- China
- Prior art keywords
- program
- current
- coding block
- code
- bit
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于Clang程序结构的控制流程图自动生成方法,具体为:首先,逐行读入数据库中的Clang程序结构分析器的分析结果;分析结果包括程序编码块,本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,本行代码中的关键字相对于程序起始的偏移量以及本行中的关键字信息所占字节数;对程序块编码分析;最后控制流程图绘制,输出svg文件。利用该方法能够很好地解决不同语句之间的嵌套问题,同时可以分析逻辑复杂的程序,并正确地生成其控制流图,解决了程序流程的可视化问题,进而为基于流程图的程序分析和程序理解提供良好的基础。
Description
技术领域
本发明属于计算机技术领域,具体涉及一种基于Clang程序结构的控制流程图自动生成方法。
背景技术
控制流程图是软件设计和测试的基础。理解一个源程序的首要任务就是理解其逻辑结构。在程序分析领域,控制流图作为刻画程序的控制结构的工具,在优化编译器设计、程序测试和程序结构复杂度分析中应用广泛。是一种揭示和掌握封闭系统逻辑结构的有效方式。
随着目前软件规模的日益扩大,程序模块逻辑越来越复杂,传统的流程图虽然可描述程序内部的控制流,但已经不能满足实际的工程应用,通过控制流程图来理解程序和测试软件也越来越困难。
传统的流程图连线错综交叠,没有直接将程序语句表示在图元中,忽略了流程图中的过程细节,只体现了程序的控制结构,缺乏对跳转语句等特殊状态的处理,当程序较大时显得过于庞杂,无法让人清晰的把握控制流走向。
发明内容
本发明的目的是提供一种基于Clang程序结构的控制流程图自动生成方法,解决了现有方法中不同语句之间的嵌套问题,实现了从源程序到控制流图的自动生成。
本发明所采用的技术方案是,一种基于Clang程序结构的控制流程图自动生成方法,具体按照以下步骤实施:
步骤1,逐行读入数据库中的Clang程序结构分析器的分析结果;
分析结果包括程序编码块,本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,本行代码中的关键字相对于程序起始的偏移量以及本行中的关键字信息所占字节数;
步骤2,程序块编码分析;
步骤3,控制流程图绘制,输出svg文件。
本发明的特点还在于,
步骤2中,具体为:
步骤2.1,根据程序编码块判断基本显示结构,基本显示结构分别有For循环结构、While循环结构、Do-while循环结构、Switch-Case结构、If判断结构和Sequence结构,在此基础上,创建6张线性表,用于存储上述6种基本显示结构;
步骤2.2,记录、存储读入的基本显示结构,并分析它们之间的关联关系;
基本显示结构和程序编码块的第三和第四位之间的对应关系分别为:
For循环开始:30,For循环结束:32;While循环开始:40;While循环结束:42;Do-while循环开始:50;Do-while循环结束:54;Switch选择开始:20,Switch选择结束(有default):24,Switch选择结束(无default):25;Case结构开始:21;If判断开始:10,If判断结束:14;Else结构开始:12;
当读入的分析结果中第三位为3,则该结果所对应的显示图元为For循环结构,此时,创建一个For循环结构,并将该结构存入存放For结构的线性表中,再将该结果的第三和第四位综合在一起,如果第三四位结果为30,那么该分析结果所对应的是For循环的开始,此时,结合本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,通过计算字段偏移量的方法,得出相应For循环结构的开始条件、结构变量以及循环结束条件,将这些信息一一存入当前For结构中;而若第三四位结果为32,那么该分析结果所对应的是For循环的结束;当多个基本显示结构同时存在于同一个控制流程图时,对于顺序关系的处理方法为,当读入某个图元的开始,在创建图元的数据的结构时,为该图元赋一个全局编号,通过编号能确定不同结构之间的先后次序;对于嵌套关系,首先,判断是否还有未处理的、从数据库读入内存的程序编码块,如果有,则将该程序编码块从数据库中读入,开始处理,对该编码块的内容进行判断,判断所显示的基本显示结构和程序编码块之间的对应关系,如果当前程序编码块的第三四位为任意图元的开始,则创建相应的图元结构,读入并存储绘制该图元所需的基本信息,最后为该新建的图元赋予全局编号,之后利用辅助栈结构判断不同图元间的嵌套关系,即对栈顶进行判断,如果栈顶有元素,则将当前图元的编号赋给栈顶元素的Children,再将当前图元压入栈内,并使得当前全局编号自增,如果栈顶没有元素,直接使当前图元进栈,同时全局编号自增;在该过程结束后,回到开始位置继续判断是否还有未处理的编码块,重复该步骤,直至处理完所有的编码块;
在处理过程中,若发现当前编码块不属于任何图元的开始部分,则开始判断当前编码块是否为任意图元的结束部分,如果发现当前编码块也不是任意图元的结束部分,则继续回到开始位置中判断是否还有未处理完的编码块,而如果当前编码块是任意图元的结束部分,那么则将相对应的栈顶元素出栈,并根据当前栈顶元素所表示的图元不同,将栈顶元素存入相应的6张线性表其中之一,在完成上述步骤后,回到开始位置继续处理后续编码块,直至所有在内存中的编码块被处理完为止,记录存储基本显示结构并分析其之间的关联关系;
步骤2.3,对跳转语句进行处理;
若当前程序编码块第三和第四位的值为21时,代表该程序编码块对应某case语句,此时,结合本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,通过计算字段偏移量的方法,获取该case语句的执行内容,即解析编码中的内容并存入caseterm[casenumber]中;将casejmp[casenumber]设置为0,表示尚无法确定当前case执行结束后如何跳转,此时,再将统计case个数的casenumber自增,为记录switch中下一个case做准备,完成上述流程后,记录case的执行体工作结束,然后,继续判断程序编码块第五位,若当前程序编码块第五位为2时,将casejmp[casenumber]设置为2;若当前程序编码块第五位为3时,将casejmp[casenumber]设置为3;若当前程序编码块第五位为4时,将casejmp[casenumber]设置为4;若当前程序编码块第五位为5时,将casejmp[casenumber]设置为5;即表示该case执行完后会进行break/continue/return/exit跳转;否则该case不含跳转,即执行完该case之后会执行下一个case;否则,即当前程序编码块第三和第四位的值不为21时,将当前程序编码块第五位的数字赋给栈顶元素的jmpflag[],表示该栈顶元素所表示的显示图元中,包含某种类型的跳转语句;若当前程序编码块第五位为2,将表示break跳转的2赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为3,将表示continue跳转的3赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为4,将表示return跳转的4赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为5,将表示exit跳转的5赋给当前栈顶元素的jmpflag[];
对else-if语句进行处理,若读入程序编码块的三、四位字段为12,则能确定该行为else语句,此时判断klen字段,若klen字段为0,则表示else后不含任何内容,若后续的程序编码块为10,则该If结构一定是else-if结构;否则,在确定为else语句结构之后,其klen字段字段不为0,则表示else的执行体中有内容,则后续程序编码块若为10,该If结构与上一个If结构呈并列关系;
步骤2.4,组装分析结果,以配置文件的形式传递给Java程序;
在经历上述分析后,其结果呈现为6张线性表的形式,在生成xml文件时,需要遍历6张线性表,按照全局变量由小到大的顺序,开始进行信息的拼接;
For表中的每一个For元素,首先为其创建一个<For>,然后将该For元素在线性表中的名称赋给该<For>的name属性,使用<Number>全局变量</Number>的方式记录该For元素的全局变量值,读取For元素中的内容,包括开始条件、结束条件、循环变化条件、以及该For元素包含哪些其他的显示结构图元、该For元素所包含的跳转,用java中的setfilter方法,替换上述读取内容中的关键字,规则如下:<小于替换为<;>大于替换为>;&和号替换为&;'
单引号替换为&apos;"引号替换为";使用<forstart>开始条件</forstart>的格式记录该For元素的开始条件,使用<forend>结束条件</forend>的格式记录该For元素的结束条件,使用<forchange>循环变化条件</forchange>的格式记录该For元素的循环变化条件,使用<children code=“x”>children[x]</children>的格式记录该For元素所包含的其他显示结构,使用<mcjumpflag code=“x”>mcjumpflag[x]</mcjumpflag>的方式确定该For元素所包含的跳转,上述过程完成之后,创建</For>,完成for元素的记录;对While、do-while、sequence、If、swtich的处理与For相同。
步骤3中,具体为:
步骤3.1,根据程序块编码分析的结果,调用Java程序解析XML文件,生成Jgraph的图形创建代码;
首先java端程序接收由步骤2发来的转化完成信号,并读入已经生成的XML文件,在此基础上,利用JNI与Java端实现互操作;
步骤3.2,调用Jgraph绘制流程图,输出svg文件;
paintFlow方法:用于建立控制流程图,并以svg格式输出;setStyles方法:自定义图的样式,其中lx是菱形,ty是椭圆,jx是矩形,group是组;buildGraph方法:将图元组建成图,绘图语句按照“创建图元——创建边关系——创建组关系”的顺序进行生成。
本发明的有益效果是,
基于Clang程序结构分析器的分析结果,结合JGraphx图形显示技术,设计了一套完整的由程序分析结果到程序控制流程图的转化方法,实现了从源程序到控制流图的自动生成。利用给出的控制流图生成算法能够很好地解决不同语句之间的嵌套问题,同时可以分析逻辑复杂的程序,并正确地生成其控制流图,解决了程序流程的可视化问题,进而为基于流程图的程序分析和程序理解提供良好的基础。绘制的结果相较于以往的方法相比,更多的凸显了流程图的内部过程细节,为软件测试和后期维护提供了可靠的支持。
附图说明
图1是本发明一种基于Clang程序结构的控制流程图自动生成方法的流程图;
图2是本发明方法中存储图元及确认关联关系的流程图;
图3是本发明方法中跳转语句处理的流程图。
图4是本发明方法中对switch case语句处理的流程图;
图5是本发明方法中分析结果转化成XML文件图;
图6是传统方法绘制其控制流程图;
图7是采用本发明方法绘制出的控制流图(一);
图8是采用本发明方法绘制出的控制流图(二);
图9是采用本发明方法绘制出的控制流图(三)。
具体实施方式
下面结合附图和具体实施方式对本发明进行详细说明。
本发明一种基于Clang程序结构的控制流程图自动生成方法,如图1所示,具体按照以下步骤实施:
步骤1,逐行读入数据库中的Clang程序结构分析器的分析结果;供后续分析和处理使用;
分析结果包括程序编码块(code字段),本行程序代码所在的行数(line字段),off字段(本行代码相对于程序起始的偏移量),len(本行代码所占字节数),koff(本行代码中的关键字相对于程序起始的偏移量)以及klen(本行中的关键字信息所占字节数);
步骤2,程序块编码分析,具体为:
步骤2.1,根据程序编码块判断基本显示结构,基本显示结构分别有For循环结构、While循环结构、Do-while循环结构、Switch-Case结构、If判断结构和Sequence结构,在此基础上,创建6张线性表,用于存储上述6种基本显示结构;
程序编码块code字段的第三位表示不同类型的语句;其中,第三位为1、2、3、4、5的代码块分别代表该代码块属于If判断结构、Switch-Case结构、For循环结构、While循环结构和Do-while循环结构;由于程序编码块的第三位只给出对应源程序语句的类型,因此还需要判断第三位为1-5的代码的性质;
步骤2.2,记录、存储读入的基本显示结构,并分析它们之间的关联关系;
基本显示结构和程序编码块的第三和第四位之间的对应关系分别为:
For循环开始:30,For循环结束:32;While循环开始:40;While循环结束:42;Do-while循环开始:50;Do-while循环结束:54;Switch选择开始:20,Switch选择结束(有default):24,Switch选择结束(无default):25;Case结构开始:21;If判断开始:10,If判断结束:14;Else结构开始:12;
当读入的分析结果中第三位为3,则该结果所对应的显示图元为For循环结构,此时,创建一个For循环结构,并将该结构存入存放For结构的线性表中。再将该结果的第三和第四位综合在一起,如果第三四位结果为30,那么该分析结果所对应的是For循环的开始,此时,结合本行程序代码所在的行数(line字段),off字段(本行代码相对于程序起始的偏移量),len(本行代码所占字节数),通过计算字段偏移量的方法,得出相应For循环结构的开始条件、结构变量以及循环结束条件,将这些信息一一存入当前For结构中,供后续绘制流程图时参考;而若第三四位结果为32,那么该分析结果所对应的是For循环的结束。通过上述步骤,可以在绘制程序控制流程图的时候呈现更多的流程细节,使得绘制的控制流程图相较于以往的图形更加具体形象,能够更清晰的凸显出程序执行的流程;
在存储不同的基本显示结构的同时,还需要对不同的基本显示结构之间的关系做梳理,当多个基本显示结构同时存在于同一个控制流程图时,其相互关联关系主要有两种:顺序关系和嵌套关系。顺序关系是指某一基本显示结构在其他基本显示结构的前(后)面;嵌套关系是指某一基本显示结构是另一基本显示结构的执行体。然而仅凭程序编码块中的信息是无法判别基本显示结构之间关联关系的;
具体为:对于顺序关系的处理方法为,当读入某个图元的开始,在创建图元的数据的结构时,为该图元赋一个全局编号(从1开始自增)。通过编号能确定不同结构之间的先后次序,解决图元之间顺序关系识别和存储。而对于嵌套关系,由于程序编码块与源程序一一对应,因此在完成程序编码块的遍历之前,无法准确确定各图元之间的嵌套关系。本发明使用栈结构辅助解决图元之间嵌套关系的识别。栈内的每个元素均为结构体类型,该结构体内容包含了While结构、Do-while结构、For结构、Switch结构和If结构。每个结构体能够记录其所包含的子结构的名称(以下简称为Children)。整个处理基本显示结构(图元)间的嵌套关系的过程如图2所示。
首先,判断是否还有未处理的、从数据库读入内存的程序编码块,如果有,则将该程序编码块从数据库中读入,开始处理,对该编码块的内容进行判断,判断所显示的基本显示结构和程序编码块之间的对应关系,如果当前程序编码块的第三四位为任意图元的开始,则创建相应的图元结构,读入并存储绘制该图元所需的基本信息,最后为该新建的图元赋予全局编号(从1开始),之后利用辅助栈结构判断不同图元间的嵌套关系,即对栈顶进行判断,如果栈顶有元素,则将当前图元的编号赋给栈顶元素的Children,再将当前图元压入栈内,并使得当前全局编号自增,如果栈顶没有元素,直接使当前图元进栈,同时全局编号自增。在该过程结束后,回到开始位置继续判断是否还有未处理的编码块,重复该步骤,直至处理完所有的编码块;
如果在处理过程中,发现当前编码块不属于任何图元的开始部分,则开始判断当前编码块是否为任意图元的结束部分,如果发现当前编码块也不是任意图元的结束部分,则继续回到开始位置中判断是否还有未处理完的编码块,而如果当前编码块是任意图元的结束部分,那么则将相对应的栈顶元素出栈,并根据当前栈顶元素所表示的图元不同,将栈顶元素存入相应的6张线性表其中之一,例如,如果读入编码块为32,则当前编码块为For图元的结束,那么将栈顶的For图元出栈,存入存放For图元的线性表中。在完成上述步骤后,回到开始位置继续处理后续编码块,直至所有在内存中的编码块被处理完为止,记录存储基本显示结构(图元)并分析其之间的关联关系;
步骤2.3,对跳转语句进行处理;
首先是记录跳转语句,由控制流程图基本显示结构中程序编码块的第五位记录该编码块的跳转信息。因此,在遍历程序编码块的过程中,需要增加对于程序编码块第五位的判断:程序编码块第五位共有六种状态,1代表goto、2代表break、3代表continue、4代表return、5代表exit,而0代表本行程序无跳转(考虑到程序的规范化书写的要求,在此不考虑GOTO语句的处理);为每一个在栈元素设计一个跳转字段数组jmpflag[]来存储跳转情况,与此同时,在遍历编码块,在确定基本绘制图元和其关联关系时,加入对程序跳转情况的记录。具体分析方法如图3及图4所示。具体为:
若当前程序编码块第三和第四位的值为21时,代表该程序编码块对应某case语句,此时,结合本行程序代码所在的行数(line字段),off字段(本行代码相对于程序起始的偏移量),len(本行代码所占字节数),通过计算字段偏移量的方法,获取该case语句的执行内容,即解析编码中的内容并存入caseterm[casenumber]中;将casejmp[casenumber]设置为0,表示尚无法确定当前case执行结束后如何跳转,此时,再将统计case个数的casenumber自增,为记录switch中下一个case做准备。完成上述流程后,记录case的执行体工作结束。然后,继续判断程序编码块第五位,若当前程序编码块第五位为2时,将casejmp[casenumber]设置为2;若当前程序编码块第五位为3时,将casejmp[casenumber]设置为3;若当前程序编码块第五位为4时,将casejmp[casenumber]设置为4;若当前程序编码块第五位为5时,将casejmp[casenumber]设置为5;即表示该case执行完后会进行break/continue/return/exit跳转。否则该case不含跳转,即执行完该case之后会执行下一个case。
否则,即当前程序编码块第三和第四位的值不为21时,将当前程序编码块第五位的数字赋给栈顶元素的jmpflag[],表示该栈顶元素所表示的显示图元中,包含某种类型的跳转语句;若当前程序编码块第五位为2,将表示break跳转的2赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为3,将表示continue跳转的3赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为4,将表示return跳转的4赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为5,将表示exit跳转的5赋给当前栈顶元素的jmpflag[];
对else-if语句进行处理,由于else-if结构的特殊性,仅凭读入的程序编码块是很难判断读入的if是否为上一个else的分支,为了解决这个问题,本发明采取的方法如下:Clang程序结构分析器的处理结果中,有存放关键字长度的klen字段,根据上文可知,若读入程序编码块的三、四位字段为12,则能确定该行为else语句,此时判断klen字段,若klen字段为0,则表示else后不含任何内容,若后续的程序编码块为10,则该If结构一定是else-if结构;否则,在确定为else语句结构之后,其klen字段字段不为0,则表示else的执行体中有内容,则后续程序编码块若为10,该If结构一定与上一个If结构呈并列关系;
步骤2.4,组装分析结果,以配置文件的形式传递给Java程序;
在经历上述分析后,其结果呈现为6张线性表的形式,而线性表中的每个元素都有其唯一的全局变量编号。在生成xml文件时,需要遍历6张线性表,按照全局变量由小到大的顺序,开始进行信息的拼接,如图5所示;
For表中的每一个For元素,首先为其创建一个<For>,然后将该For元素在线性表中的名称赋给该<For>的name属性,使用<Number>全局变量</Number>的方式记录该For元素的全局变量值,读取For元素中的内容,包括开始条件、结束条件、循环变化条件、以及该For元素包含哪些其他的显示结构图元、该For元素所包含的跳转,用java中的setfilter方法,替换上述读取内容中的关键字,规则如下(是为了防止与xml文件中规定的关键字冲突):<小于替换为<;
>大于替换为>;&和号替换为&;'单引号替换为&apos;"引号替换为";使用<forstart>开始条件</forstart>的格式记录该For元素的开始条件,使用<forend>结束条件</forend>的格式记录该For元素的结束条件,使用<forchange>循环变化条件</forchange>的格式记录该For元素的循环变化条件,使用<children code=“x”>children[x]</children>的格式记录该For元素所包含的其他显示结构,这里的属性code中的x与children[x]中的x相同,使用<mcjumpflag code=“x”>mcjumpflag[x]</mcjumpflag>的方式确定该For元素所包含的跳转,这里的属性code中的x与mcjumpflag[x]中的x相同,上述过程完成之后,创建</For>,完成for元素的记录。对While、do-while、sequence、If、swtich的处理与For相同:
步骤3,控制流程图绘制,具体为:
步骤3.1,根据程序块编码分析的结果,调用Java程序解析XML文件,生成Jgraph的图形创建代码;
首先java端程序接收由步骤2发来的转化完成信号,并读入已经生成的XML文件,在此基础上,利用JNI(Java Native Interface,java本地接口)与Java端实现互操作;
步骤3.2,调用Jgraph绘制流程图,输出svg文件。
paintFlow方法:用于建立控制流程图,并以svg格式输出;setStyles方法:自定义图的样式,控制流程图中的图元样式都是自定义的样式,这些自定义样式在setStyles方法中定义,其中lx是菱形(分支框),ty是椭圆(开始和结束框),jx是矩形(处理框),group是组(嵌套关系框)。buildGraph方法:将图元组建成图,绘图语句按照“创建图元——创建边关系——创建组关系”的顺序进行生成。
为了验证本发明的成果,采用Qt编程平台,使用C++语言作为实验对象,本发明使用Java语言实现,在eclipse平台下完成,不同平台之间的数据交互通过XML形式完成,Qt平台下,使用JNI(Java Native Interface,java本地接口)与Java端实现互操作。为检验最终结果,本发明选择了一段复杂C++程序作为范例,首先按传统方法绘制其控制流程图,结果如图6所示;使用本发明的方法对程序进行执行分析,绘制出的控制流图如图7-9所示;由结果对比可见,对于复杂的程序结构,对比传统的控制流程图(图6),用本发明绘制的控制流程图清晰完整的反映了程序控制流程,并记录了程序中的重要控制信息,使得结果更加直观更加有条理,因此更利于编程人员和测试人员对程序进行理解。
Claims (1)
1.一种基于Clang程序结构的控制流程图自动生成方法,其特征在于,具体按照以下步骤实施:
步骤1,逐行读入数据库中的Clang程序结构分析器的分析结果;
分析结果包括程序编码块,本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,本行代码中的关键字相对于程序起始的偏移量以及本行中的关键字信息所占字节数;
步骤2,程序块编码分析;具体为:
步骤2.1,根据程序编码块判断基本显示结构,基本显示结构分别有For循环结构、While循环结构、Do-while循环结构、Switch-Case结构、If判断结构和Sequence结构,在此基础上,创建6张线性表,用于存储上述6种基本显示结构;
步骤2.2,记录、存储读入的基本显示结构,并分析它们之间的关联关系;
基本显示结构和程序编码块的第三和第四位之间的对应关系分别为:
For循环开始:30,For循环结束:32;While循环开始:40;While循环结束:42;Do-while循环开始:50;Do-while循环结束:54;Switch选择开始:20,有default时,Switch选择结束:24,无default时,Switch选择结束:25;Case结构开始:21;If判断开始:10,If判断结束:14;Else结构开始:12;
当读入的分析结果中第三位为3,则该结果所对应的显示图元为For循环结构,此时,创建一个For循环结构,并将该结构存入存放For结构的线性表中,再将该结果的第三和第四位综合在一起,如果第三四位结果为30,那么该分析结果所对应的是For循环的开始,此时,结合本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,通过计算字段偏移量的方法,得出相应For循环结构的开始条件、结构变量以及循环结束条件,将这些信息一一存入当前For结构中;而若第三四位结果为32,那么该分析结果所对应的是For循环的结束;当多个基本显示结构同时存在于同一个控制流程图时,对于顺序关系的处理方法为,当读入某个图元的开始,在创建图元的数据的结构时,为该图元赋一个全局编号,通过编号能确定不同结构之间的先后次序;对于嵌套关系,首先,判断是否还有未处理的、从数据库读入内存的程序编码块,如果有,则将该程序编码块从数据库中读入,开始处理,对该编码块的内容进行判断,判断所显示的基本显示结构和程序编码块之间的对应关系,如果当前程序编码块的第三四位为任意图元的开始,则创建相应的图元结构,读入并存储绘制该图元结构所需的基本信息,最后为该图元结构赋予全局编号,之后利用辅助栈结构判断不同图元间的嵌套关系,即对栈顶进行判断,如果栈顶有元素,则将当前图元的编号赋给栈顶元素的Children,再将当前图元压入栈内,并使得当前全局编号自增,如果栈顶没有元素,直接使当前图元进栈,同时全局编号自增;在该过程结束后,回到开始位置继续判断是否还有未处理的编码块,重复该步骤,直至处理完所有的编码块;
在处理过程中,若发现当前编码块不属于任何图元的开始部分,则开始判断当前编码块是否为任意图元的结束部分,如果发现当前编码块也不是任意图元的结束部分,则继续回到开始位置中判断是否还有未处理完的编码块,而如果当前编码块是任意图元的结束部分,那么则将相对应的栈顶元素出栈,并根据当前栈顶元素所表示的图元不同,将栈顶元素存入相应的6张线性表其中之一,在完成上述步骤后,回到开始位置继续处理后续编码块,直至所有在内存中的编码块被处理完为止,记录存储基本显示结构并分析其之间的关联关系;
步骤2.3,对跳转语句进行处理;
若当前程序编码块第三和第四位的值为21时,代表该程序编码块对应某case语句,此时,结合本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,通过计算字段偏移量的方法,获取该case语句的执行内容,即解析编码中的内容并存入caseterm[casenumber]中;将casejmp[casenumber]设置为0,表示尚无法确定当前case执行结束后如何跳转,此时,再将统计case个数的casenumber自增,为记录switch中下一个case做准备,完成上述流程后,记录case的执行体工作结束,然后,继续判断程序编码块第五位,若当前程序编码块第五位为2时,将casejmp[casenumber]设置为2;若当前程序编码块第五位为3时,将casejmp[casenumber]设置为3;若当前程序编码块第五位为4时,将casejmp[casenumber]设置为4;若当前程序编码块第五位为5时,将casejmp[casenumber]设置为5;即表示该case执行完后会进行break/continue/return/exit跳转;否则该case不含跳转,即执行完该case之后会执行下一个case;否则,即当前程序编码块第三和第四位的值不为21时,将当前程序编码块第五位的数字赋给栈顶元素的jmpflag[],表示该栈顶元素所表示的显示图元中,包含某种类型的跳转语句;若当前程序编码块第五位为2,将表示break跳转的2赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为3,将表示continue跳转的3赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为4,将表示return跳转的4赋给当前栈顶元素的jmpflag[];若当前程序编码块第五位为5,将表示exit跳转的5赋给当前栈顶元素的jmpflag[];
对else-if语句进行处理,若读入程序编码块的三、四位字段为12,则能确定当前行为else语句,此时判断klen字段,若klen字段为0,则表示else后不含任何内容,若后续的程序编码块为10,则当前的If结构一定是else-if结构;否则,在确定为else语句结构之后,其klen字段不为0,则表示else的执行体中有内容,则后续程序编码块若为10,表示当前的If结构与上一个If结构呈并列关系;
步骤2.4,组装分析结果,以配置文件的形式传递给Java程序;
在经历上述分析后,其结果呈现为6张线性表的形式,在生成xml文件时,需要遍历6张线性表,按照全局变量由小到大的顺序,开始进行信息的拼接;
For表中的每一个For元素,首先为其创建一个<For>,然后将该For元素在线性表中的名称赋给该<For>的name属性,使用<Number>全局变量</Number>的方式记录该For元素的全局变量值,读取For元素中的内容,包括开始条件、结束条件、循环变化条件、以及该For元素包含哪些其他的显示结构图元、该For元素所包含的跳转,用java中的setfilter方法,替换上述读取内容中的关键字,规则如下:<小于替换为<;>大于替换为>;&和号替换为&;'
单引号替换为&apos;"引号替换为";使用<forstart>开始条件</forstart>的格式记录该For元素的开始条件,使用<forend>结束条件</forend>的格式记录该For元素的结束条件,使用<forchange>循环变化条件</forchange>的格式记录该For元素的循环变化条件,使用<children code=“x”>children[x]</children>的格式记录该For元素所包含的其他显示结构,使用<mcjumpflag code=“x”>mcjumpflag[x]</mcjumpflag>的方式确定该For元素所包含的跳转,上述过程完成之后,创建</For>,完成for元素的记录;对While、do-while、sequence、If、swtich的处理与For相同;
步骤3,控制流程图绘制,输出svg文件;具体为:
步骤3.1,根据程序块编码分析的结果,调用Java程序解析XML文件,生成Jgraph的图形创建代码;
首先java端程序接收由步骤2发来的转化完成信号,并读入已经生成的XML文件,在此基础上,利用JNI与Java端实现互操作;
步骤3.2,调用Jgraph绘制流程图,输出svg文件;
paintFlow方法:用于建立控制流程图,并以svg格式输出;setStyles方法:自定义图的样式,其中lx是菱形,ty是椭圆,jx是矩形,group是组;buildGraph方法:将图元组建成图,绘图语句按照“创建图元——创建边关系——创建组关系”的顺序进行生成。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010428445.5A CN111708572B (zh) | 2020-05-20 | 2020-05-20 | 一种基于Clang程序结构的控制流程图自动生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010428445.5A CN111708572B (zh) | 2020-05-20 | 2020-05-20 | 一种基于Clang程序结构的控制流程图自动生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111708572A CN111708572A (zh) | 2020-09-25 |
CN111708572B true CN111708572B (zh) | 2022-11-25 |
Family
ID=72537886
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010428445.5A Active CN111708572B (zh) | 2020-05-20 | 2020-05-20 | 一种基于Clang程序结构的控制流程图自动生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111708572B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106508009B (zh) * | 2010-12-31 | 2014-07-02 | 上海机电工程研究所 | 一种面向过程的高级语言源程序流程图的生成方法 |
CN104503793A (zh) * | 2014-12-24 | 2015-04-08 | 风腾科技(北京)有限公司 | 代码练习软件中代码的运行和图形化的解析方法 |
CN104794401A (zh) * | 2015-04-15 | 2015-07-22 | 南京大学 | 一种静态分析辅助的符号执行漏洞检测方法 |
JP2017064844A (ja) * | 2015-09-30 | 2017-04-06 | 株式会社三次元メディア | プログラム自動生成装置 |
CN108681529A (zh) * | 2018-03-26 | 2018-10-19 | 山东科技大学 | 一种流程模型图的多语言文本及语音生成方法 |
US10303466B1 (en) * | 2016-09-07 | 2019-05-28 | Amazon Technologies, Inc. | Semantic annotations in source code |
CN110673852A (zh) * | 2019-09-20 | 2020-01-10 | 北京智游网安科技有限公司 | 一种基于编译器前端实现控制流平坦的方法、系统及设备 |
US10599404B1 (en) * | 2012-06-01 | 2020-03-24 | Altera Corporation | M/A for compiling parallel program having barrier synchronization for programmable hardware |
-
2020
- 2020-05-20 CN CN202010428445.5A patent/CN111708572B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106508009B (zh) * | 2010-12-31 | 2014-07-02 | 上海机电工程研究所 | 一种面向过程的高级语言源程序流程图的生成方法 |
US10599404B1 (en) * | 2012-06-01 | 2020-03-24 | Altera Corporation | M/A for compiling parallel program having barrier synchronization for programmable hardware |
CN104503793A (zh) * | 2014-12-24 | 2015-04-08 | 风腾科技(北京)有限公司 | 代码练习软件中代码的运行和图形化的解析方法 |
CN104794401A (zh) * | 2015-04-15 | 2015-07-22 | 南京大学 | 一种静态分析辅助的符号执行漏洞检测方法 |
JP2017064844A (ja) * | 2015-09-30 | 2017-04-06 | 株式会社三次元メディア | プログラム自動生成装置 |
US10303466B1 (en) * | 2016-09-07 | 2019-05-28 | Amazon Technologies, Inc. | Semantic annotations in source code |
CN108681529A (zh) * | 2018-03-26 | 2018-10-19 | 山东科技大学 | 一种流程模型图的多语言文本及语音生成方法 |
CN110673852A (zh) * | 2019-09-20 | 2020-01-10 | 北京智游网安科技有限公司 | 一种基于编译器前端实现控制流平坦的方法、系统及设备 |
Non-Patent Citations (2)
Title |
---|
Visualization of Promela with NS-Chart;Arin Chawanothai;《2019 12th International Conference on Information & Communication Technology and System (ICTS)》;20190930;全文 * |
基于图元装接模式由程序流程图自动生成源代码;许秀林;《软件工程》;20161130;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111708572A (zh) | 2020-09-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106874244B (zh) | 一种基于工作序列的文档自动生成模型的构建方法 | |
TWI243306B (en) | Shared library system and method of building the system | |
Petrick | A recognition procedure for transformational grammars. | |
US5594892A (en) | Method for automated software application testing | |
JPH02109127A (ja) | 仕様処理方法 | |
JPS6375835A (ja) | 目的コ−ド、プログラム・リスト及び設計文書を生成する装置 | |
CN108279885B (zh) | 一种对多个模型代码进行软件集成的方法及装置 | |
KR20080086456A (ko) | 찾기 및 교체 입력의 파생어를 레버리징하는 찾기 및 교체기능을 갖춘 텍스트 편집 방법 및 시스템 | |
CN109491658A (zh) | 计算机可执行代码数据的生成方法及装置 | |
CN102567201A (zh) | 跨模型的图形用户界面测试脚本自动修复方法 | |
CN111309313A (zh) | 一种快速生成html以及存储表单数据的方法 | |
CN114594933A (zh) | 基于文件扫描的前端代码生成方法、装置及存储介质 | |
CN103235757B (zh) | 基于自动化造数对输入域测试对象进行测试的装置和方法 | |
CN112860264B (zh) | 一种抽象语法树重构方法及装置 | |
CN101201750B (zh) | 利用语法词法分析工具为编解码提供数据的方法 | |
CN111708572B (zh) | 一种基于Clang程序结构的控制流程图自动生成方法 | |
CN115640014A (zh) | 一种基于编译植入特征码的功能块在线校核方法 | |
Zhang et al. | Analysis of automatic code generation tools based on machine learning | |
CN114116475A (zh) | 一种基于日志的软件调试方法 | |
CN112651214B (zh) | 数据表格明文转换为便于程序可读取的二进制密文的方法 | |
CN114781330A (zh) | 一种基于需求建模的类型检查方法 | |
US6981219B2 (en) | Method and system for processing formulas and curves in a document | |
AU760395B2 (en) | Program reproducing method and device, and medium on which program for program reproduction recording | |
JPWO2020254962A5 (zh) | ||
CN116880826B (zh) | 一种可视化代码生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |