模糊测试学习

发表于:2009-02-26来源:作者:点击数: 标签:学习
先看如下这段代码 1intfunc1(inta,charb,charc) 2 3{ 4 5if(a0a100b==0c==255) 6 7{ 8 9printf(\"triga bug \"); 10 11return0; 12} 13 14return1; 15} 16 这段代码的意思就是在参数 如何通过测试找到这些bug呢?这是一个问题,如何在一堆API的参数中找到这
先看如下这段代码
 
 1int func1(int a,char b, char c)
 2
 3{
 4
 5         if(a>0&&a<100&& b==0 && c==255)
 6
 7         {
 8
 9                   printf(\"trig a bug\");
10
11                   return 0;
12         }
13
14         return 1;
15}
16

    这段代码的意思就是在参数
    如何通过测试找到这些bug呢?这是一个问题,如何在一堆API的参数中找到这样的bug,这是一个大问题。嗯我们现在就讨论这个问题。


    从我们便于理解的角度上看这个问题。其实我们希望我们的测试用例能够在一定概率的情况下在整个参数空间中触及到这个bug的触发参数区域。
    最笨的办法就是枚举测试空间,这个实际上并不是一个可行的方法。参数空间会随着参数的个数增加产生参数空间爆炸。
    那到底该怎么办呢?在有限的资源下最大可能的找到这样的有问题的参数样本,可行的办法就是一堆随机的参数来然后通过合适的组合来尽可能的覆盖整个参数空间。现在问题就是如何产生合适的随机数了。下面我们就讨论一下如何或者比较好的随机数和如何比较好的组合在一起。
    随机数:
    随机数在软件开发中应用很广泛,在通信,加密,游戏中都需要随机数发生器。那什么是随机数呢?
    随机数至少应该具备两个条件:
1. 数字序列在统计上是随机的。
2. 不能通过已知序列来推算后面未知的序列。
    只有实际物理过程才是真正随机的。而一般来说,计算机是很确定的,它很难得到真正的随机数。所以计算机利用设计好的一套算法,再由用户提供一个种子值,得出被称为“伪随机数”的数字序列,这就是我们平时所使用的随机数。
 
    这种伪随机数字足以满足一般的应用,但它不适用于加密等领域,因为它具有弱点:
 
1. 伪随机数是周期性的,当它们足够多时,会重复数字序列。
2. 如果提供相同的算法和相同的种子值,将会得出完全一样的随机数序列。
3. 可以使用逆向工程,猜测算法与种子值,以便推算后面所有的随机数列。 
 

原文转自:http://www.ltesting.net