综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表...
综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表示本次执行没有新的路径产生,该测试用例不会被放入测...
综上所述,AFL 的启发式变异策略通过覆盖率引导实现:只有当 has_new_bits 返回非 0 时(即测试用例带来了路径命中次数的改变或新路径的发现),测试用例才会被放入测试队列进一步变异。具体而言,save_if_interesting 中调用 has_new_bits 获取返回值,如果为 0,表示本次执行没有新的路径产生,该测试用例不会被放入测...
如果falut为None,且该queue是第一次执行,且不属于dumb_mode,且new_bits为0,代表这个用例在所有轮次的执行里,没有发现任何新路径和出现异常,则设置fault为FAULT_NOBITS 如果new_bits为2,并且q->has_new_cov为0,则置1,并将queued_with_cov加1,代表有一个queue发现了新路径 如果该queue是可变路径,计算var_byte...
检查执行结果是否有趣,即,调用has_new_bits(virgin_bits)来判断是否产生了新的路径元组,若是则保存或加入队列。trace_bits指向由全体进程共享的内存区域,其中包含每次样本执行的覆盖率,其实是之后提到的覆盖次数桶的压缩存储。 2.2 插桩技术 既然要进行覆盖率的引导来辅助遗传算法的进化过程,就必须统计覆盖率,而如果...
如果发现不同,则调用 has_new_bits函数和总表virgin_bits 对比; 10.判断q->exec_cksum 是否为0,不为0说明不是第一次执行。后面运行如果和前面第一次 trace_bits 结果不同,则需要多运行几次; 11.loop循环结束; 12.收集一些关于测试用例性能的统计数据。比如执行时间延迟,校准错误,bitmap大小等等;...
(first_trace, trace_bits, MAP_SIZE); hnb = has_new_bits(virgin_bits); if (hnb > new_bits) new_bits = hnb; } start_us = get_cur_time_us(); for (stage_cur = 0; stage_cur < stage_max; stage_cur++) { // 开始执行 calibration stage,总计执行 stage_max 轮 u32 cksum; if (...
*/ if (!dumb_mode && first_run && !fault && !new_bits) fault = FAULT_NOBITS; abort_calibration: if (new_bits == 2 && !q->has_new_cov) { q->has_new_cov = 1; queued_with_cov++; } /* Mark variable paths. */ if (var_detected) { var_byte_count = count_bytes(var_...
hnb = has_new_bits(virgin_bits) 如果hnb大于new_bits,设置new_bits的值为hnb 如果q->exec_cksum不等于0,即代表这是判断是否是可变queue i从0到MAP_SIZE遍历,如果first_trace[i]不等于trace_bits[i],代表发现了可变queue,且var_bytes为空,则将该字节设置为1,并将stage_max设置为CAL_CYCLES_LONG,即需要...
将本次运行的出现trace_bits哈希和本次 testcase的q->exec_cksum对比。如果发现不同,则调用has_new_bits函数和总表virgin_bits对比; 判断q->exec_cksum是否为0,不为0说明不是第一次执行。后面运行如果和前面第一次trace_bits结果不同,则需要多运行几次; ...