这篇文章和上一篇一样,只会着重地分析一些比较重要的部分。
fuzz_one
这是一个函数,从准备fuzz的队列中拿出一项,用来fuzz,这个函数返回0就代表fuzz成功,1就代表这个被跳过或不要这一项了
1 | if (pending_favored) { |
假如pending_favored为真,那么判断下当前从队列中拿出来的这一项是否被fuzz过,或者不是favired的,当这两个条件满足其中一项,就会随机一个0-100的数,假如随机到100才会继续下去(非常残酷啊)
1 | else if (!dumb_mode && !queue_cur->favored && queued_paths > 10) { |
然后假如满足不是dumb模式,当前项不是favored,并且等待fuzz的有10项以上,就会进入else if的流程中
假如当前项没被fuzz过,就有75%的几率跳过,被fuzz过就有95%的几率跳过
1 | /* Map the test case into memory. */ |
这部分是将当前的test case用mmap读进内存中
1 | if (queue_cur->cal_failed) { |
假如当前项有校准错误,并且校准错误次数小于3次,那么就用calibrate_case进行测试
1 |
|
这一部分就是对样例进行trimming,trim_case这个函数我们之后会进行分析
1 | /********************* |
这里是用calculate_score计算评分,然后下面是根据各种条件,然后直接跳到havoc那个变异阶段
1 | for (stage_cur = 0; stage_cur < stage_max; stage_cur++) { |
下面这一部分就是
先留着坑,有空填