编写测试驱动
基本用法
对于任何函数,都可以使用以下的宏,将它定义为一个测试入口:
WFUZZ_TEST_ENTRYPOINT(function)
其中function是待测的函数。可以支持不同的输入参数。
上述的宏在wfuzz.h中定义,测试驱动需引入这个文件,例如:
#include <wfuzz.h>
void test_something(char* data, size_t len) {
//TODO: 调用需要测试的方法
}
WFUZZ_TEST_ENTRYPOINT(test_something);
在这个例子中,test_something会被反复调用,每次会输入不同的数据。 在函数执行过程中,框架会对程序的内存访问、程序行为进行检测,如果出现问题,就会报告这个问题。
带有全局初始化的测试
在上一个例子中,test_something会被反复调用。 如果程序执行之前,需要先进行某些初始化操作,而且初始化操作由于性能或者逻辑限制,不能反复调用, 则可以单独定义一个初始化函数,此函数只执行一次。使用下面的宏来注册这个入口:
WFUZZ_TEST_ENTRYPOINT_WITH_INIT(function, init);
其中function和基本用法中的作用一致,但多了一个init函数,它是个void()类型的函数。 示例程序如下:
#include <wfuzz.h>
CTX ctx;
void test_something_init() {
init_ctx(&ctx);
}
void test_something(char* data, size_t len) {
parse(&ctx, data, len);
}
WFUZZ_TEST_ENTRYPOINT_WITH_INIT(
test_something,
test_something_init
);
在这个例子中,模糊测试器会在启动后,先执行一次init,然后再循环执行function。
测试函数类型
对于测试函数,返回值类型可以是任意的,函数返回值会被忽略。
在 C 和 C++ 环境下,测试函数支持的参数类型不同:
-
C 环境下,参数类型只能是
(char* data, size_t len)
,测试框架将会把输入的原始缓冲区传给测试函数。测试函数可以任意使用。 -
C++ 环境下,支持任意数量的参数。测试框架内置部分参数类型的适配,同时支持用户自己扩展框架,以使其支持任意类型的参数。
阅读章节【进阶使用-数据类型支持】可以进一步了解WINGFUZZ原生支持的数据类型和如何扩展类型支持。