README_zh.md
1# c_utils基础库fuzzy测试
2
3
4## 简介
5
6使用Fuzzing测试框架,将自动生成的随机数据输入到测试程序中,监视程序异常崩溃,以发现可能的程序错误。
7
8## fuzz用例设计说明
9### Parcel模块用例设计说明
10Parcel模块的接口分为3组:
11- 普通接口——内存地址对齐的接口;
12- 非对齐接口——内存地址不对齐的接口;
13- 其他接口——设置parcel数据大小相关的接口。
14
15各组之间的接口互斥,不能在一次测试中同时调用。测试设置300秒时限,在时限内会反复调用用例入口函数,每轮测试首先随机选择一组,然后在组内循环随机调用接口若干次,以确保接口的调用顺序和调用次数的随机性。
16
17### RefBase模块用例设计说明
18测试设置300秒时限,在时限内会反复调用用例入口函数,每轮测试创建多个线程,各个线程随机调用RefBase的接口,确保多线程下使用的稳定性。
19#### 测试流程
20```mermaid
21flowchart TB
22 A[创建RefBase对象]-->B[随机创建n个线程]
23 B-->D{判断分组}
24 subgraph 线程1
25 subgraph loop:随机调用RefBase的接口
26 D-->|引用计数减1的接口|E[更新本线程引用计数]
27 E-->F{是否计数归零}
28 F-->|是|G[加写锁]
29 G-->调用引用计数减1的接口-->R[解写锁]
30 F-->|否|H[直接调用引用计数减1的接口]
31 D-->|Read类型或引用计数加1的接口|J{是否计数归零}
32 J-->|是|K[加读锁]
33 K-->L{RefBase自身是否已释放}
34 L-->|是|M[释放存在的WeakRefCounter对象]
35 M-->N[解读锁]
36 L-->|否|O[调用Read类型或引用计数加1的接口]
37 O-->Q[更新本线程引用计数]
38 J-->|否|P[调用Read类型或引用计数加1的接口]
39 P-->S[更新本线程引用计数]
40 end
41 R-->T[根据剩余的引用计数次数,调用计数减1的接口,将计数清零]
42 H-->T
43 Q-->T
44 S-->T
45 N-->return
46 end
47 B-->U[循环随机调用RefBase的接口]
48 subgraph 线程2
49 U
50 end
51 B-->V[循环随机调用RefBase的接口]
52 subgraph 线程n
53 V
54 end
55 Y[若未释放RefBase,释放RefBase]
56 T-->Y
57 U-->Y
58 V-->Y
59```
60#### 测试说明
61结构体SingleThreadCount记录单个线程内部的强弱引用计数情况:
62
63| 变量 | 描述 |
64| -------------------------------------- | ------------------------------------------------------------ |
65| **size_t** strongCount = 0; | 强引用计数,DecStrongRef、IncStrongRef、AttemptIncStrongRef等会影响该计数。 |
66| **size_t** weakCount = 0; | 弱引用计数,DecWeakRef、IncWeakRef会影响该计数。 |
67| **bool** weakRefCounterExists = false; | 是否创建了WeakRefCounter对象。 |
68| **size_t** weakRefCount = 0; | WeakRefCounter造成的弱引用计数加减,DecWeakRefCount、IncWeakRefCount会影响该计数。 |
69
70由于RefBase及其成员RefCounter会在所有线程引用计数归零时自动释放,所以各个线程在不知道其它线程引用计数的情况下,需要在自身计数即将归零时加锁,确保RefBase和其成员RefCounter释放的过程中其它线程不会进行有关操作。
71
72此外,attempIncStrongRef、AttemptIncStrong、AttemptAcquire、IncStrongRef之间需要加另一套锁,避免多个线程同时调用的情况下出现强引用计数异常。
73
74### Timer模块用例设计说明
75测试设置300秒时限,在时限内会反复调用用例入口函数,每轮测试内部循环多次,每次循环首先设置计时器,然后随机组合调用Register和Unregister函数,每次调用Register时随机设置回调响应时间并随机sleep一段时间,使回调响应随机执行,最后关闭计时器。
76
77## 编译构建
78### 编译fuzz测试程序
79```
80./build.sh --product-name rk3568 --build-target commonlibrary/c_utils/base/test/fuzztest
81```
82
83## 目录
84
85```
86fuzztest/
87├── parcel_fuzzer/
88 ├── corpus # Fuzz语料目录
89 │ ├── init # Fuzz语料
90 ├── BUILD.gn # Parcel模块的Fuzz用例编译配置
91 ├── parcel_fuzzer.cpp # Parcel模块的Fuzz用例源文件
92 ├── parcel_fuzzer.h # Parcel模块的Fuzz用例头文件
93 ├── project.xml # Parcel模块的Fuzz选项配置文件
94├── refbase_fuzzer/
95 ├── corpus # Fuzz语料目录
96 │ ├── init # Fuzz语料
97 ├── BUILD.gn # RefBase模块的Fuzz用例编译配置
98 ├── refbase_fuzzer.cpp # RefBase模块的Fuzz用例源文件
99 ├── refbase_fuzzer.h # RefBase模块的Fuzz用例头文件
100 ├── project.xml # RefBase模块的Fuzz选项配置文件
101├── timer_fuzzer/
102 ├── corpus # Fuzz语料目录
103 │ ├── init # Fuzz语料
104 ├── BUILD.gn # Timer模块的Fuzz用例编译配置
105 ├── timer_fuzzer.cpp # Timer模块的Fuzz用例源文件
106 ├── timer_fuzzer.h # Timer模块的Fuzz用例头文件
107 ├── project.xml # Timer模块的Fuzz选项配置文件
108├── BUILD.gn # c_utils库Fuzz整体编译配置
109├── fuzz_log.h # Fuzz用例调试log头文件
110```
111
112