admin 管理员组文章数量: 1087139
2023年12月20日发(作者:gz型钢)
S0FTWARE DEVEL0PMENT AND DESIGN 软件开发与设计 数组越界的静态分析 惠小霞,张岩 (江苏自动化研究所,江苏连云港222006) 摘要:软件测试分为静态测试和动态测试,而数组越界是静态测试中最常见的问题之一,并且其带来的危害巨 大,甚至导致软件系统崩溃。根据数组越界的现象及特点,详细描述了数组越界的定义和种类,给出了数组越界产 生的条件及防范技巧,并对检测方法及工具进行比较分析,从而更好地实现软件测试。 关键词:静态测试‘9数组越界;检测方法;工具 Static Analysis of Array Bound HUI Xiaoxia,ZHANG Yan (Jiangsu Automation Research Institute,Jiangsu Lianyungang 222006) Abstract:software test include static testing and dynamic testing,array bound is the one of high frequency issue in the static testing,and bring the disserve is huge,even lead software system breakdown。This paper on the basis of array bound phenomenon and characteristic,particular description the definition and species of array bound,give the produce condition and the skill of avoid array bound,also compare and analysis the detection method and tool of array bound,thereby good enough actualize software test. Key words:static test;Array bound;detection method;tool 1 概述 软件测试是保证软件质量和可靠性的重要手段,在整个 软件生命周期中占有重要位置。根据在测试过程中是否运行 软件代码,可将软件测试分为静态测试和动态测试两种方法。 在静态测试中最常见的问题之一为数组越界,数组越界 秒呵扫描上万行代码,具有检测速度快、效率高的特点。 3 数组越界 数组(array)是C或c++等语言常见的一种数据类型,是 若干同类变量的聚合,可以存储相同类型的多个数据项,它 是同一种数据类型在内存中的连续存放。数组变量在定义时 是缓冲区溢出故障中最常见的问题,缓冲区溢出是一种常见 且危害很大的软件错误,如果程序的缓冲区被写入超出其长 度的内容,就会造成缓冲区溢出,程序的堆栈被破坏,从而 就已经确定了所使有的内存空间大小,因此程序在运行过程 中如果数组变量的索引超过了定义的内存空间大小,系统可 能会将一个随机的值赋给变量,而得不到预期的结果;对于 导致软件系统崩溃。数组越界带来的后果主要有两种: (1) 对数组的访问超越了边界,使程序运行错误,甚至导致出现 越界写数据就有可能修改相邻内存的一些重要的信息,从而 造成程序的运行混乱,这类错误称之为数组越界(Array Bound),数组越界在使用数组类型进行程序设计的软件中属于 常见的一类错误,它主要是程序设计中引用数组元素时,对 内存的操作超过了初始指定的范围而引起,通常数组越界分 为上溢和下溢。声明/定义一个长度为 【Jf7的数组,则其下标范 异常; (2)对数组以外的区域进行操作,有可能引入恶意代 码,对软件安全造成威胁,主要针对数组越界问题给出了防 范技巧及检测方法和工具,并对方法及工具进行了优缺点分 析。 2 静态分析 静态分析(Static Analysis),也叫静态规则检查或代码规 范检查,是指在不执行程序代码的方式下,通过控制流分析、 数据流分析、表达式分析、接口分析等寻找程序代码中可能 围为【0,LeJ —l J,如果以 为数组下标引用数组元素,当i<0时, 则发生故障,称之为下溢;当i>Len—l,则称之为上溢。因此 对数组边界的检查即要检查数组的上界还需检查数组的下界。 C/C++语言为了提高运行效率,不会自动检查数组越界, 也就是说如果数组越界,程序编译时不会报错,从而在执行 时产生非法操作或者得不到正确的结果。在c/C++语言中下标 的引用超过声明的范围是数组越界常见的错误,在程序中还 有其他的一些错误,也属于数组越界: 存在的错误或评估程序代码的过程。静态分析是验证代码是 否满足规范性、可靠性、可维护性、安全性等指标的一种代 码分析技术。它可以手工进行,也可以借助软件T具自动进 行,以达到检测的目的。其主要优点就是在程序运行之前就 可以对程序故障进行定位。 静态分析技术主要具有以下特点: (1)指针变量的引用:在C或C++语言中由于指针引用 较普遍,通过指针可直接访问变量的内存地址,并且可以改 (1)不必动态地运行程序。静态分析只需通过工具或人 T或二者相结合的方法对代码进行分析,不必进行测试用例 的设计和测试结果的判读等工作。 作者简介:惠小霞(1979一),女,工程师,研究方向:软件测 评。 (2)执行速度快、效率高。目前成熟的代码分析工具每 收稿日期:2011-12—16 淼 l7_
电脑编程技巧与维护 变内存地址的指向和相应的内容,且C或C++语言本身并没 有对边界进行自动检测的操作,因此在程序代码实现中,就 要保证指针的指向不会超越边界,否则程序有可能存在越界。 (2)在C或c++语言中使用字符串操作的库函数,如 strcpy 0,sprintf 0等库函数,南于其本身没有越界操作判 断,往往会发生越界故障。例如在执行strcpy 0函数时,需 要考虑源参数所占空间大小必须小于或等于目标空间的大小, 否则将出现越界。 数组越界漏洞产生必须要具备3个条件: 1)存在数组的形式; 2)存在对数组的拷贝或读取操作; 3)引用数组下标,超过了数组下标的允许范围。 下面是3个数组越界的例子: 题(1) 1 void main 0 2{ 3 int M=10; 4 int Array【M1; 5 for =0;i<=M;i++1 6 { 7 int X=new Array[i】; 8 Array【i]=foo(x); 9 } 1O 1 题f2) 1 void test 0 2 { 3 char string[10]; 4 char strl:”0123456789”: 5 strcpy(string,str1); 6 } 题f3) 1 #include<stdio.h> 2 3 int main 0 4 { 5 int a[5]={0,1,2,3,4}, P 6 P a: 7 prinff(”%d\Il”, (P+4 sizeof(int))); 8 9 return O: 10 l 这3道题都存在数组越界的问题: 题(1)中,Array li1明显发生了数组越界。 题(2)中,string是一个含有10个元素的字符数组, strI指向的字符串长度为10,在进行strcpy调用时,会将strl 的结束符也复制@Jstring数组里,即复制的字符个数为1 1,这 样会导致sf, ingOd现数组越界。程序不一定会因此而崩溃,但 1 _銎 与||E 这是一个潜在的危险。解决办法是将string的元素个数定义为 11。 题(3)中,代码第6行,P指向a的第1个元素,所以 p+4指向a的最后一个元素即4,P+4*sizeq/’(int) ̄p p+16, 此时指向的是数组a的第17个元素,显然已经越界了,因此 输出的打印结果是个随机数。 由于C或c++语言不进行边界的自动检测,因此在程序 代码编写过程中就需要考虑这方面问题,下面罗列了一些防 止数组越界漏洞的小技巧: (1)每次要访问数组时用if或断言来判断。 (2)用try…catch…语句来写代码。 (3)使用迭代器(itemtor),遍历STL里面vector的部分 或全部元素。 (4)分配好数组的长度、类别、数据的多少,注意及时 释放内存。 (5)为防止越界访问,可以写一个array类把数组封装起 来,在其operator I1中检查其下标是否越界。 (6)在数组结束时设置标志。 (7)函数参数是数组时一般应该把数组大小也传进来。 4 数组越界的检测 4.1检测方法 目前检测数组越界的方法主要分为两大类:动态检测方 法和静态检测方法。动态检测是在源代码中可能出现数组越 界的位置进行插装,即在程序中数组使用的地方加入逻辑断 言或其他类型的语句,对插装后的代码编译运行,在运行中 检查是否存在缓冲区溢出漏洞,存在数组越界错误的程序运 行时,它的运行现象表现是不定的,有时候程序一直运行, 可能什么异常情况都不会发生;有时候,则是程序运行会出 现异常崩溃,且出现的问题是不可复现的。动态检测方法能 够精确判断出程序中是否出现了缓冲区溢出,检测结果的可 信度较高;但其缺点是仅可以部分实现对数组越界故障的测 试,且降低了程序的运行效率,增加了开销,在覆盖率和效 率方面存在问题。 静态检测是相对于动态检测的另一大类方法,它可以全 面检测程序的控制结构,静态检测方法通过分析源代码来检 测可能存在的安全漏洞,其主要是对源程序进行词法分析和 语法分析,产生与程序对应的语法数,将相应的节点挂在语 法树上进行检测分析,其一般是通过使用预先定义好的漏洞 数据库,在程序源代码中进行匹配查找操作。如果匹配成功, 就给出相应的警告或错误信息,但可能会给出错误的警告, 给检查结果带来负面影响。 4.2检测工具 下面简要介绍一些数组越界检查相关的方法和工具。 (1)向程序和标准库的源代码中添加注解,用注解辅助 静态分析工具Splint以快速有效地检测越界漏洞,这种方法具 有简单、快速、高效、可扩充的特点。它利用程序中注解提 (下转到34页)
版权声明:本文标题:数组越界的静态分析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1703010725a439540.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论