一种基于Clang程序结构的控制流程图自动生成方法技术

技术编号:25755747 阅读:7 留言:0更新日期:2020-09-25 21:05
本发明专利技术公开了一种基于Clang程序结构的控制流程图自动生成方法,具体为:首先,逐行读入数据库中的Clang程序结构分析器的分析结果;分析结果包括程序编码块,本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,本行代码中的关键字相对于程序起始的偏移量以及本行中的关键字信息所占字节数;对程序块编码分析;最后控制流程图绘制,输出svg文件。利用该方法能够很好地解决不同语句之间的嵌套问题,同时可以分析逻辑复杂的程序,并正确地生成其控制流图,解决了程序流程的可视化问题,进而为基于流程图的程序分析和程序理解提供良好的基础。

【技术实现步骤摘要】
一种基于Clang程序结构的控制流程图自动生成方法
本专利技术属于计算机
,具体涉及一种基于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语句结构本文档来自技高网...

【技术保护点】
1.一种基于Clang程序结构的控制流程图自动生成方法,其特征在于,具体按照以下步骤实施:/n步骤1,逐行读入数据库中的Clang程序结构分析器的分析结果;/n分析结果包括程序编码块,本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,本行代码中的关键字相对于程序起始的偏移量以及本行中的关键字信息所占字节数;/n步骤2,程序块编码分析;/n步骤3,控制流程图绘制,输出svg文件。/n

【技术特征摘要】
1.一种基于Clang程序结构的控制流程图自动生成方法,其特征在于,具体按照以下步骤实施:
步骤1,逐行读入数据库中的Clang程序结构分析器的分析结果;
分析结果包括程序编码块,本行程序代码所在的行数,本行代码相对于程序起始的偏移量,本行代码所占字节数,本行代码中的关键字相对于程序起始的偏移量以及本行中的关键字信息所占字节数;
步骤2,程序块编码分析;
步骤3,控制流程图绘制,输出svg文件。


2.根据权利要求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,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的执行体工作结束,然后,继续判断程序编码块第五位,若...

【专利技术属性】
技术研发人员:王周恺马维纲王锋黑新宏陈浩张毅坤
申请(专利权)人:西安理工大学
类型:发明
国别省市:陕西;61

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1