1

这是一段代码:

struct somedata {
    char mychar;
    int myint;
    unsigned short myushort;
    string mystring;
};

void some_func(somedata *data) {
  /* does something with data */
}

你如何编写一个完美的模糊测试函数来测试这段代码的正确功能、安全性和健壮性?

完美是指涵盖所有情况的完整测试(如果可能)。说:超出范围的值,不同的数据类型等。

您没有some_func.

4

2 回答 2

1

您可能会发现有趣的一件事是使用诸如美国模糊 lop之类的基因模糊器,而不是自己编写模糊测试。您必须修改您的程序以对标准输入和输出(或在命令行中提到的文件)进行操作,并使用特殊的 GCC/LLVM 包装器对其进行编译,但作为交换,您将获得一种执行模糊测试的方法一个可以学习输入/输出格式的工具。它了解哪些位在修改时会引发新的代码路径,并给予他们一些额外的关注。另外,看看 LLVM 的LibFuzzer,它使用了类似的想法。

于 2015-10-13T21:47:30.253 回答
0

看来我fuzzing错了。

模糊测试是一种简单的技术,可以对您的代码质量产生深远的影响。在模糊测试中,我们将随机的坏数据注入到应用程序中,以查看发生了什么问题

因为Fuzzing != Testing,我们不会构建完美的测试用例或测试所有可能的用例,而是随机生成错误数据并将其插入到应用程序中。

上述代码的典型模糊测试功能是:

void fuzzTesting ()
{
    //create somedata
    somedata data;

    //generate a random vector
    srand(time(NULL)); //seed = current_time

    //bufferOverflow
    int i= 200000
    while(i>=0)
    {
        r = rand()
        data.mychar = r;
        data.myint = r;
        data.myushort = r;
        some_func(&data);
        --i;
    }

    //Format String
    int i= 200000
    while(i>=0)
    {
        r = rand()
        data.mychar = '%s' + r;
        data.myint = '%s' + r;
        data.myushort = '%s' + r;
        some_func(&data);
        --i;
    }

    //Integer overflow
    int i= 200000
    while(i>=0)
    {
        r = rand()
        data.mychar = r + 0xffffffff;
        data.myint = r + 0xffffffff;
        data.myushort = r + 0xffffffff;
        some_func(&data);
        --i;
    }
}

有关更多模糊测试向量和详细信息,请参阅此wikipage

于 2014-06-06T11:52:45.163 回答