crazyfuzz产品说明书

简介:

crazyfuzz是一个对基本数据类型进行fuzz和提供fuzz数据的跨平台公共库,减少服务器和客户端编写fuzz工具的重复工作。crazyfuzz通过生产和变异两种方式产生数据,面向对象主要为测试工具的编写人员。

 

fuzz的数据类型

crazyfuzz能生成的fuzz数据类型包括:

·数字型数据:int8-int64uint8-uint64floatdouble

·字符型数据:单个charasc码字符串、gbk字符串、gb2312字符串、utf8字符串、根据既定字符集合生成字符串、根据正则生成字符串

crazyfuzz能够变异的数据类型包括:

·数字型数据:int8-int64uint8-uint64floatdouble

·字符型数据:单个char、普通字符串、指定asc码范围的定向变异、指定非变异集的变异

·二进制数据:按位进行变异(类似zzuf

 

crazyfuzz的特性

crazyfuzz具有如下特点:

·私有的随机数生成器,fuzz的过程不受其他随机函数调用的影响;贯穿始终的私有随机数生成器也使得fuzz过程可以重现。

·对数字型数据采用正态分布的生成方式,而不是杂乱的随机,使得数据可以更有效的集中在均值。同时,生成数字型数据时会混杂不同数据类型的边界值在里面,帮助更好的发现被测程序缺陷。

·生成不同编码集的字符串,包括ascgbkgb2312utf8

·强大的正则表达式生成字符串方式,可以轻松的生成类似邮箱地址这样的有变化又有特殊要求的字符串。(语法见下文)

·边界值混合比率和变异比率都作为参数可自行配置。

·seed可重设,帮助复现。

crazyfuzz的跨平台折中与编译:

·crazyfuzz目前已在linuxwindows平台下使用gcc编译通过。

·crazyfuzz依赖于boost::random库,需要先装boost库。

·crazyfuzz自身设计为一个线程安全的库,要在多线程环境中调度,请编译时依赖boost::random库的多线程版本,即mt版本。

 

如何使用crazyfuzz

·首先,using namespace crazyfuzz,然后实例化一个cfuzz。(当然你需要引用cfuzz.h

 

cfuzz myfuzz;

cfuzz myfuzz(1);

cfuzz myfuzz(_gettime());

 

cfuzz的构造函数有带参数seed和不是用seed两种,不带seed时,seed为默认值(不是0)。如果想取一个随意的seed,可以调用crazyfuzzutil.h中的_gettime(),该函数是取CPUrdstc值(即CPU的运行周期滴答数),在同一台机器上绝对不会重复。

虽然实例化一个cfuzz并不太占资源,但仍然建议您实例化一个到几个cfuzz即可,cfuzz除保存自己的私有随机数生成器以外,不会存其他的状态信息。

·然后调用一个对应的函数接口即可。

 

int8_t myint = myfuzz.get_int8();

string mystr1 = myfuzz.get_gbk(buf, buf_size, from , to);

string mystr2 = myfuzz.get_by_regex(“/(wg).[a-z]{1,10}/”);

string mystr3 = myfuzz.fuzz_string(mystr1, rate);

 

其中get_开头的为生成数据操作,fuzz_开头的为变异数据操作,对于数字类型和charget_操作其实也是变异操作。如原数据为10,那么可以调用get_int32(10, 5),重新按均值为10,标准差为5的正态分布重新生成一个接近于10的数。

接口说明

·cfuzz中的接口分为3大类:数字操作,字符串生成操作和变异操作

·数字操作:

因数据类型较多,数字操作的接口也较多,但参数都完全一样,返回的结果是按照设定比例的正态分布集合和边界值集合的混合,get_int8返回一个数据,get_int8_array返回一组数据:

 

int16_t get_int16(int16_t mean=FUZZ_NORMAL_MEAN, int16_t sigma=FUZZ_NORMAL_INT16_SIGMA, int16_t min=FUZZ_INT16_MIN, int16_t max=FUZZ_INT16_MAX, unsigned int boundary_rate=BOUNDARY_RATE);

 

mean为均值,sigma为标准差,min为最小取值,max为最大取值,boundary_rate为边界值的比率,0~100整数取值。其默认值可以才fuzz_conf.h中设置和查询。

·字符串生成操作:

字符串操作的函数都包括:

 

 

 

 

·变异操作:

变异操作的接口如下:

 

 

 

 

其中fuzz_stringfuzz_string_asc_rangefuzz_string_except为对字符串的编译操作,分别提供了三种形式,其中两种针对char*(原地操作和结果保存在另一个char*),一种针对stringrate为变异率,0~100的整数取值。

fuzz_string_asc_range只会在给定的asc区间[left, right]闭集取值来取代被变异的字符,fuzz_string_except则可以给变异字符串添加不被变异字符的例外。

fuzz_binary是对二进制进行操作的,编译比率精确到bit,采用反转bit0-1进行变异。提供原地反转和不破坏源数据的两种形式。

 

crazyfuzz正则语法

crazyfuzz的正则语法专用于get_by_regex()接口生成字符串,其语法与通用正则表达式类似。

·正则表达式必须被//包围,例:/(wanggang).[0-9]{2}/

·正则表达式由若干个unit组成,每个unit又由描述和数量两部分组成,如上例包含(wanggang).[0-9]{2}两个unit,在第二个unit[0-9]为描述部分,{2}为数量部分,表示[0-9]被执行两次。最终的可能执行结果为wanggang16。两部分缺一不可。

·描述部分是对字符取值的描述:

 

[],在集合中随机选一个字符,支持-符号来表示一个取值范围,例:[0-9a-zA-Z:;]表示在字母和数字以及冒号分号中随机抽取一个,注意:-左边的字符的asc码必须小于右边,不支持反义符号^。
(),在集合中原样输出所有字符,不支持-符号,例(wanggang),将会取里面的8个字符。
\d,生成一个数字,等价于[0-9]
\D,生成一个非数字,即\d的反集
\w,生成一个英文字母、数字或下划线,等价于[0-9a-zA-Z_]
\W,\w的反集
\s,生成一个空白字符,等价于[\f\n\r\t\v]
\S,\s的反集
•数量部分是描述部分的取值次数:
各符号用下表表示
符号 from to
? 0 1
. 1 1
* 0 MAX
+ 1 MAX
{m} m m
{m,n} m n
{m,} m MAX
数量部分的取值是from和to直接的随机数,MAX默认取值为100。

·转义:

{}[]()*.?+\-这些符号作为特殊的语法识别符,用他们作为字符自身使用时,需要转义(前面加\),主要体现在在[]()包围区域中使用,例如[\*-\\]表示从*\范围的字符。

注意:由于从c++语言描述到传递到编译器间有语言本身的字符转义,所以要表示一个\需要\\,因此[\*-\\]应表示为[\\*-\\\\],可以通过cout看他编译后的形式。

例:

/[\*-\\]{100}/

cout<<"/[\\*-\\\\]{100}/"<<endl;

cout<<myfuzz.get_by_regex("/[\\*-\\\\]{100}/")<<endl;

输出:

/[\*-\\]{100}/

Z;FWO:9C2P+JH*A,QC5QP<8.C==*Z:IG2\1D2*P7RI;+N5WVL>OK;KB.0*[L[:WK>H9NUTWH4M8/AR38207G:TZ9RX*94Q,HTJPG

 

附,asc码表
0 NUT 32 (space) 64 @ 96 ¡¢ 
1 SOH 33 £¡ 65 A 97 a 
2 STX 34 ¡± 66 B 98 b 
3 ETX 35 # 67 C 99 c 
4 EOT 36 $ 68 D 100 d 
5 ENQ 37 % 69 E 101 e 
6 ACK 38 & 70 F 102 f 
7 BEL 39 , 71 G 103 g 
8 BS 40 ( 72 H 104 h 
9 HT 41 ) 73 I 105 i 
10 LF 42 * 74 J 106 j 
11 VT 43 + 75 K 107 k 
12 FF 44 , 76 L 108 l 
13 CR 45 - 77 M 109 m 
14 SO 46 . 78 N 110 n 
15 SI 47 / 79 O 111 o 
16 DLE 48 0 80 P 112 p 
17 DCI 49 1 81 Q 113 q 
18 DC2 50 2 82 R 114 r 
19 DC3 51 3 83 X 115 s 
20 DC4 52 4 84 T 116 t 
21 NAK 53 5 85 U 117 u 
22 SYN 54 6 86 V 118 v 
23 TB 55 7 87 W 119 w 
24 CAN 56 8 88 X 120 x 
25 EM 57 9 89 Y 121 y 
26 SUB 58 : 90 Z 122 z 
27 ESC 59 ; 91 [ 123 { 
28 FS 60 < 92 \ 124 | 
29 GS 61 = 93 ] 125 } 
30 RS 62 > 94 ^ 126 ~ 
31 US 63 ? 95 ¡ª 127 DEL 

 

baiduqaqablog@baidu.com

 

 

char get_char();
char get_char(char from, char to);
int get_asc(char *buf, size_t buf_size, size_t from , size_t to);
std::string get_asc(size_t from, size_t to);
int get_gbk(char *buf, size_t buf_size, size_t from , size_t to);
std::string get_gbk(size_t from , size_t to);
int get_gb2312(char *buf, size_t buf_size, size_t from , size_t to);
std::string get_gb2312(size_t from , size_t to);
int get_utf8(char *buf, size_t buf_size, size_t from , size_t to);
std::string get_utf8(size_t from , size_t to);
int get_expected(const char *expected, char *buf, size_t buf_size, size_t from, size_t to);
std::string get_expected(const char *expected, size_t from, size_t to);
std::string get_by_regex(const char *regex);

其中get_char()是产生单个asc字符,其他都是产生字符串。
几乎所有接口都提供两种不同参数的接口,分别对应于char *和string两种返回方式。在使用char*方式时需要注意的是,gbk、gb2312生成的字符,一个字符要用2个char来装,utf8的要用3个char来装,请确保你提供的buf能够容纳的下,返回的char*字符串最后会以’\0’结尾。from和to为一个随机长度的区间,程序会返回区间内长度的字符,from必须<=to。
get_expected()会只生成expected参数指定的字符集构成的asc字符串。
get_by_regex()会根据规定语法的正则表达式生成特殊格式要求的字符串,详细的正则语法见下文。

 

 

int fuzz_string(char *str, unsigned int str_size, unsigned int rate);

int fuzz_string(char *str, unsigned int str_size, char *dest, unsigned int dest_size, unsigned int rate);

std::string fuzz_string(const std::string& str, unsigned int rate);

int fuzz_string_asc_range(char *str, unsigned int str_size, unsigned int left, unsigned int right,unsigned int rate);

int fuzz_string_asc_range(char *str, unsigned int str_size, char *dest, unsigned int dest_size, unsigned int left, unsigned int right, unsigned int rate);

std::string fuzz_string_asc_range(const std::string &str, unsigned int left, unsigned int right,unsigned int rate);

int fuzz_binary(void *data, unsigned int data_size, unsigned int rate);

int fuzz_binary(void *data, unsigned int data_size, void *dest, unsigned int dest_size, unsigned int rate);

int fuzz_string_except(const char *except, char *str, unsigned int str_size, unsigned int rate);

int fuzz_string_except(const char *except, char *str, unsigned int str_size, char *dest, unsigned int dest_size, unsigned int rate);

std::string fuzz_string_except(const char *except, const std::string& str, unsigned int rate);

【本文转自百度测试技术空间http://hi.baidu.com/baiduqa/blog/item/0a57a5b1773179b2d9335a57.html
















本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/744435,如需转载请自行联系原作者

相关文章
|
1月前
|
运维 测试技术 API
产品服务的详细设计与开发阶段
产品服务的详细设计与开发阶段
32 2
|
6月前
关于会议OA需求分析与开发功能设计
关于会议OA需求分析与开发功能设计
45 0
|
6月前
|
运维
软件需求说明书应包括的内容
软件需求说明书应包括的内容
|
监控 测试技术 程序员
销售指导工具
本文研究全球及中国市场销售指导工具现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比北美、欧洲、中国、日本、东南亚和印度等地区的现状及未来发展趋势
产品需求说明书 PRD模版
      XXX产品需求说明书 [版本号:V+数字]                 编  制:   日  期:   评  审:   日  期:   批  准:   日  期:         修订记录 版本 修订章节 修订内容 修订日期 修订人 V1.
6464 0