循环代码模型构建方法

        循环结构是源代码程序的重要结构,然而即使是简单的循环程序,也很容易出错,循环中的很多错误往往需要执行多次或者在某些特定的情况下才能被发现,检测这些错误的代价很高,所以需要重点开展对软件循环代码的安全性分析研究,而对循环代码结构进行研究的重要前提是构建有效且准确的循环模型。

       构建循环模型通常是以代码解析为基础进行的,代码解析的结果是代码元数据。循环定义信息可直接从代码元数据中提取。通过分析变量应用元数据可获取循环数据集合。以循环体内的元数据为基础,对循环体代码进行有效的块划分,并基于块划分结果,构建起以循环体开始行为起点,以各块的起始行为节点,并依据块类型及块间关系将各节点连接在一起,以循环体终止行为终点,可构建循环体控制流图。

        1)提取循环定义信息

        循环定义信息主要包括两部分:循环描述信息和循环出口信息。

  • 提取循环描述信息

一般情况下,代码元数据中包含有循环的头部起始行、循环体起始行、终止行、入口信息、循环类型等描述信息,因此通过代码元数据可直接获取循环描述信息。

  • 提取循环出口信息

        出口信息包括出口的描述信息、直接出口条件表达式、间接出口条件表达式集合以及所应用的循环数据集合。出口描述信息包括出口位置、类型、关键词等信息。出口条件表达式是指当该条件表达式取值为真时,循环必然从该出口跳出时的条件表达式。

                 

       首先提取循环的描述信息。在一般的高级语言中,按照循环出口的位置,可将循环出口分为两类:头部出口和内部出口。如果出口为头部出口,头部出口一般同入口相重合,通过分析特定循环的元数据,将就可以获取头部出口描述信息。内部出口一般由break以及return之一构成,通过分析 break和return关键词所对应的元数据,即可获取相应的出口描述信息。

       第二步是提取出口条件表达式。出口条件又分为两种:直接出口条件和间接出口条件。对于头部出口来说,直接出口条件是指入口条件的否,对于内部出口来说,直接出口条件是指出口所在分支代码块的直接分支条件。

        另外,在获取循环数据集合的情况下,还要分析出口表达式中对循环数据的应用集合,整理出每个出口表达式中所应用的循环数据集合,为后续的循环类型判断提供支持。

2) 提取循环数据信息

        首先要获取循环数据基本信息。在构成循环体的代码中,对数据应用分为两种方式:引用和定值。定值可能会导致数据发生变化,循环体中所有进行了定值操作的不同数据构成了循环数据集合。因此首先要提取循环体中的发生定值操作的数据集合。具体要通过对代码元数据分析获取数据表达式、数据的值、行号等数据定值基本信息,除了基本信之外,数据定值的顺序对数据的终值是有影响的,还要提取出能够对数据定值进行排序的顺序号。

        判断循环是否能够准确求解的一个重要依据就是循环数据定值的发生属性。发生属性有两个取值:可能和必然。为了确定定值发生的可能性及必然性,还要分析定值发生位置所在块的所属层级,对于头部出口来说,层级号为1的定值是必然发生的。对于内部出口来说,尽管层级好不是1,内部出口位置之前同一块内的定值是必然发生。

       得到循环数据集合后,还要记录下循环函数的所有循环数据的初始值,一般情况下,初始值是求过程值和出口值的重要依据。

3) 循环体控制流图

        循环体控制流也是循环的重要特征,控制流图及其创建方法是静态分析领域的基础技术,与函数控制流图相区别,循环体控制流图是对循环体内的处理逻辑构建同其互为映射的控制流图。

        循环定义信息、循环数据信息以及循环控制流图之间的有机组合即为循环模型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

plstudio1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值