一 引言

在测试人员对代码文件进行静态分析过程中,数据流分析占有举足轻重的作用,很多重要的信息,比如不可达语句、DU、DD、UR…等都是基于数据流分析的结果而得出的。以往,数据流分析通常是由测试人员人工完成。测试者在理解代码逻辑的基础上,从被分析代码的起点跟踪数据的流向,直到到达被分析代码的终点。这项工作看起来简单,但是实际做起来却往往令测试人员感到非常头疼。主要原因有三点:1.数据的变化要随着路径长度的增加不断累积;2.分支条件要随着路径的增长不断累积,并且路径上每增加一个分支节点,都要在路径中最新的数据分析结果的基础上计算分支条件的值; 3.路径数通常随着代码规模的增长以几何级数的速度增长。无论是数据变化结果的累积还是分支条件的累积或者路径数的增长,当任何一个累计到一定数量的时候,对于人脑来说,在进行跟踪与分析就成为一件不可能完成的任务了。所以在实际的工作中,测试人员的通常做法就是尽力而为,能分析多少就分析多少。这就使很多隐藏在代码中的很多问题在测试人员面前逃之夭夭。

随着计算机技术的不断发展,各行各业的信息化工作也进行得如火如荼。“让电脑代替测试人员进行数据流分析”也不断的被提到测试行业的信息化工作当中。然而却一直进展缓慢,始终达不到工程应用的水平。最主要的拦路石有两块:1 代码中的循环结构的数据流分析;2代码中的函数调用语句的数据流分析。本文阐述的分析方法能够准确高效的完成循环结构的数据流分析。关于函数调用语句的数据流分析方法在另外一篇文章中阐述。

二 基本概念

在介绍具体方法之前,先交代涉及的主要的概念。代码的数据流分析,顾名思义就是对一段代码中从起点到终点数据流动的全过程进行分析。在数据流动的过程中,可能会出现数据定值,也可能会出现数据引用。同时,由于代码中有可能会存在多种分支语句,因此,从起点出发,会产生一条或者多条路径,每条路径中由多个节点组成,每个节点对应相应的约束条件,除此之外,每个节点还对应着到达该节点之前所有的变量应用的最终结果,我们将其称之为数据切片。随着路径长度的增长,约束条件不断累积,在到达终点之前,如果约束条件的取值为永假,则路径终止,此路径为不完整路径,如果顺利到达终点,则此路径为完整路径。由于本文阐述的是循环结构的数据流分析方法,所以有必要介绍循环相关的概念。循环的入口条件表达式如果是可计算的,或者循环中的跳出语句的约束条件集合是可求值的话,则循环为正常结束循环;否则的话,在数据流分析过程中,为了避免无意义的循环导致路径的无限延长,本文阐述的方法会设定一个阈值,如果不是正常结束循环,当循环次数超过阈值后,强制令循环终止,这样的循环称之为强制结束循环。循环中的语句和循环后的语句由于可能受到循环所造成的数据变化的影响,称之为循环相关语句。

三 循环结构的数据流分析

       对于没有循环结构和函数调用语句的代码段,目前已经形成了比较成熟的数据流分析方法,循环结构的数据流分析是对普通数据流分析方法的改进。

1 普通的数据流分析方法

对于没有循环和函数调用的代码段,一般的数据流分析方法包括变量应用分析、构建块树、建立控制流图、遍历路径等几个步骤。

  • 变量应用分析

在语法分析的基础上,对在代码中发生定值及引用的语句进行分析,并将定值及引用的变量及其具体值按照发生的顺序进行记录。注意,一定要按照顺序记录,因为不同的顺序会产生不同的数据结果。

  • 构建块图

在词法分析、语法分析的基础上,以代码段起始点为根节点,分析代码段中各分支语句如if、else if、for、 while、case…等分支语句以及break 、exit、 return…等强制转向语句的层次关系及先后关系,从而构建成一颗树,通常会将带有函数调用的语句处理为普通语句,不做为单独的一个块来处理。

  • 建立控制流图

在块树构建完成后,从根节点开始,以根节点作为源点,按照子块的先后顺序及层次关

系对子块进行分析,根据每个子块的具体类型建立其所有目标节点,所有块分析完毕后,将会构建成特定代码段的控制流图。

  • 遍历路径

从控制流图的源点开始,使用深度优先搜索遍历图中所有路径,路径边上面的变量应用都要记录到数据切片上。以最新的数据切片为基础,在遍历的过程中不断计算各节点累积约束条件的逻辑值,计算并记录下每个节点对应的最新的数据切片,获取所关注的数据流分析结果。

2 循环结构数据流分析

       要对循环结构进行正确的数据流分析,前提是正确的绘制for,while, do,break, continue等循环相关块的控制流图。在此基础上,本文分别介绍正常结束循环和强制结束循环两种情况下的数据流分析方法。

  • 正常结束循环

如果循环是正常结束循环,那么就按照正常的数据流分析即可。相较于普通的数据流分析方法,所不同就是路径随着循环次数的增加不断延长,直至循环结束。

  • 强制结束循环

由于循环被强制结束,所以每条路径的最新的数据切片、约束条件集合都是不准确的。理论上说,循环相关的语句都是不能够进行正确的数据流分析了,包括循环中的语句和循环后的语句。可循环相关语句的数据流分析往往非常重要,所以只能尽力而为了。通过对循环结构内部的数据分析,我们能够获取循环内部数值可能会发生变化的变量集合,这个集合可以看成是当前强制结束循环所造成的数据结果。在路径遍历过程中,如果到达了循环相关语句中的分支语句,暂时可将循环视而不见,认为其不存在,对分支语句的分支条件进行变量分析,如果该条件中使用了循环内部的定值集合中的变量,则认为其可取任意值,不进行分支条件的数值检测,所有分支路径都遍历。如果该条件中没有使用循环内部的定值集合中的变量,则进行正常的数据流分析。如此,能够对强制结束循环的循环相关语句中的相当一部分进行必要的数据流分析。

四 具体应用

       在测试之家开发的ufinder(不可达语句检测工具)V0.97中应用了上文阐述的对循环结构的数据流分析分析方法,相对于一般的数据流分析,在ufinder中对数据流分析进行了一定程度的简化,主要有两点:1.数据切片中仅仅存储变量的定值,而没有存储变量的引用;2.遍历过程中如果找到一条完整路径,说明存在一条可达路径,遍历过程立刻停止;通过实际工程应用的检验,本文阐述的方法确实能够准确高效且全面地对包含有函数调用语句的代码段进行数据流分析。

循环结构的数据流分析方法相关推荐

  1. Java学习笔记2.5.1 循环结构 - 条件循环

    文章目录 零.本讲学习目标 一.为什么要用循环 (一)老老实实的笨方法 (二)采用循环结构的巧方法 1.采用计数循环(for循环) 2.采用条件循环(while循环) 二.条件循环 (一)前测试循环 ...

  2. Python编程基础08:循环结构

    文章目录 一.为什么要用循环 (一)老老实实的笨方法 (二)采用循环结构的巧方法 1.采用for循环输出百遍口号 2.采用while循环输出百遍口号 二.条件循环 - while循环 (一)语法格式 ...

  3. c语言用for或while计算,C语言趣味编程:使用while循环结构计算圆周率pi

    循环结构是编程语言中的一种基本程序结构,C语言中有两种表示方法,分别可通过for循环和while循环结构实现.上篇文章已经讲了for循环的使用方法,详细请参考: 这次通过一个计算圆周率pi的例子给大家 ...

  4. 汇编语言实验5:循环结构程序设计

    <汇编语言程序设计>实验报告 实验五 循环结构程序设计 1. 实验目的 2. 实验任务 3. 实验步骤 3.1 循环结构题目设计 3.2 编写代码 3.3 代码分析 3.4 运行测试 4. ...

  5. 微型计算机循环结构程序设计,微机原理实验之_分支程序、循环程序设计

    <微机原理实验之_分支程序.循环程序设计>由会员分享,可在线阅读,更多相关<微机原理实验之_分支程序.循环程序设计(6页珍藏版)>请在人人文库网上搜索. 1.实验三分支程序.循 ...

  6. c语言条件型循环结构报告,C语言循环结构实习报告 - 副本

    认识(实习)报告 实验(实习)名称循环结构程序设计 日期得分指导教师系专业年级班次姓名学号 一. 实验目的 (1)掌握在程序设计条件型循环结构时,如何正确地设定循环条件,以及如何控制循环的次数. ⑵了 ...

  7. 以下构成python循环结构的方法中_超星尔雅初级英语口语(持续更新中)选修课答案...

    套期具有"对冲""互抵"的关系 答:正确 差异化战略核心是企业在市场营销.研究和开发.产品技术和工艺设计以及服务等方面具有强大的实力. 答:正确 以下构成Pyt ...

  8. java 语言如何判断素数_C语言实验之判断素数(循环结构java)方法讲解

    C语言实验之判断素数(循环结构java)方法讲解 Problem Description 从键盘上输入任意一个正整数,然后判断该数是否为素数. 如果是素数则输出"This is a prim ...

  9. C语言循环结构素数判断,C语言实验之判断素数(循环结构java)方法讲解

    C语言实验之判断素数(循环结构java)方法讲解 Problem Description 从键盘上输入任意一个正整数,然后判断该数是否为素数. 如果是素数则输出"This is a prim ...

最新文章

  1. linux的根文件系统中的proc文件夹详解
  2. 基于深度学习网络的运动想象BCI系统及其应用
  3. 20155335俞昆 2017-2018-1 《信息安全系统设计》第9周学习总结
  4. AtCoder AGC001F Wide Swap (线段树、拓扑排序)
  5. 【MCTalk Live】网易对话谷歌:如何成为一个顶50个的A+++++程序员
  6. 第五章 编写主引导扇区代码
  7. 球星测试软件,2KOL球星测评丨篮球之神,迈克尔.乔丹(96版)
  8. 【教程】贺岁教程之--C# getpost实例
  9. php二分法实力,php常见的几种排序以及二分法查找
  10. xgboost融合模型:大学助学金精准资助预测(有数据)
  11. 求职者:推销自己的四大妙招
  12. LinkedIn 启用俄勒冈数据中心
  13. 高斯(Gaussian)积分常用式
  14. 【洞察】152号令,重量级行业信息技术法规
  15. user guide for Coverity Wizard
  16. springboot集成jooq异常集合
  17. java调用加密机实例_Enigma Java模拟实现恩尼格玛密码机加密解密过程 Develop 238万源代码下载- www.pudn.com...
  18. 网关冗余技术、链路冗余技术 、 ACL原理、ACL配置
  19. 使用 Visio 绘制卷积示意图
  20. 关于门控时钟的毛刺解决

热门文章

  1. R语言中K-Means聚类算法
  2. python给成绩表加上姓名列_Python学习笔记 --第二章
  3. P3386 【模板】二分图最大匹配(匈牙利算法,网络流)
  4. 背景色设置透明,兼容ie浏览器设置
  5. 职场的1000+篇文章总结
  6. 从进程中获取QQ号码
  7. oracle会计软件技巧,财务软件输入凭证的五大技巧,太实用了!
  8. 百度地图自定义信息窗口样式
  9. 神经网络的图像识别技术,神经网络图像角度分析
  10. 运动都需要什么装备?运动锻炼必备物品推荐