|
|
|
@ -2546,6 +2546,11 @@ static void show_stats(void);
|
|
|
|
|
to warn about flaky or otherwise problematic test cases early on; and when
|
|
|
|
|
new paths are discovered to detect variable behavior and so on. */
|
|
|
|
|
//start_us, stop_us;
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
=======
|
|
|
|
|
|
|
|
|
|
//保存了一些旧的状态值,以便在函数执行完毕后恢复。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
|
|
|
|
|
//保存了一些旧的状态值,以便在函数执行完毕后恢复。
|
|
|
|
|
// 定义一个用于校准测试用例的函数
|
|
|
|
@ -2567,14 +2572,22 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
u32 use_tmout = exec_tmout;
|
|
|
|
|
u8* old_sn = stage_name;
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
/* 如果是在恢复会话或校准已经添加的测试用例时,会放宽超时限制。
|
|
|
|
|
这有助于避免由于间歇性延迟导致的问题。 */
|
|
|
|
|
=======
|
|
|
|
|
/* Be a bit more generous about timeouts when resuming sessions, or when
|
|
|
|
|
trying to calibrate already-added finds. This helps avoid trouble due
|
|
|
|
|
to intermittent latency. */
|
|
|
|
|
//如果是在恢复会话或校准已经添加的测试用例时,会放宽超时限制。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
if (!from_queue || resuming_fuzz)
|
|
|
|
|
use_tmout = MAX(exec_tmout + CAL_TMOUT_ADD,
|
|
|
|
|
exec_tmout * CAL_TMOUT_PERC / 100);
|
|
|
|
|
|
|
|
|
|
// 增加校准失败计数
|
|
|
|
|
q->cal_failed++;
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
|
|
|
|
|
// 设置当前阶段为“calibration”,并根据是否快速校准设置阶段最大值
|
|
|
|
|
stage_name = "calibration";
|
|
|
|
@ -2582,18 +2595,35 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
|
|
|
|
|
/* 确保在执行任何操作之前fork服务器已经启动,并且不将其启动时间计入二进制校准。 */
|
|
|
|
|
// 如果没有运行在“dumb”模式,并且没有使用fork服务器,那么初始化fork服务器
|
|
|
|
|
=======
|
|
|
|
|
//设置当前阶段为“calibration”,并根据是否快速校准设置阶段最大值。
|
|
|
|
|
stage_name = "calibration";
|
|
|
|
|
stage_max = fast_cal ? 3 : CAL_CYCLES;
|
|
|
|
|
|
|
|
|
|
/* Make sure the forkserver is up before we do anything, and let's not
|
|
|
|
|
count its spin-up time toward binary calibration. */
|
|
|
|
|
//如果没有运行在“dumb”模式,并且没有使用fork服务器,那么初始化fork服务器。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
if (dumb_mode != 1 && !no_forkserver && !forksrv_pid)
|
|
|
|
|
init_forkserver(argv);
|
|
|
|
|
|
|
|
|
|
// 如果队列条目已经有执行校验和,那么将第一次执行的trace bits复制到first_trace
|
|
|
|
|
if (q->exec_cksum) {
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
=======
|
|
|
|
|
//如果队列条目已经有执行校验和,那么将第一次执行的trace bits复制到first_trace。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
memcpy(first_trace, trace_bits, MAP_SIZE);
|
|
|
|
|
hnb = has_new_bits(virgin_bits);
|
|
|
|
|
if (hnb > new_bits) new_bits = hnb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 计时开始
|
|
|
|
|
start_us = get_cur_time_us();
|
|
|
|
|
=======
|
|
|
|
|
start_us = get_cur_time_us();//计时
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
|
|
|
|
|
// 校准循环
|
|
|
|
|
for (stage_cur = 0; stage_cur < stage_max; stage_cur++) {
|
|
|
|
@ -2602,6 +2632,7 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
|
|
|
|
|
// 如果不是第一次运行并且到了更新频率,显示统计信息
|
|
|
|
|
if (!first_run && !(stage_cur % stats_update_freq)) show_stats();
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 将测试用例数据写入文件
|
|
|
|
|
write_to_testcase(use_mem, q->len);
|
|
|
|
|
// 运行目标程序并获取执行结果
|
|
|
|
@ -2609,13 +2640,26 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
|
|
|
|
|
/* 如果用户按下Ctrl+C,stop_soon会被设置,我们希望快速退出。 */
|
|
|
|
|
if (stop_soon || fault != crash_mode) goto abort_calibration;
|
|
|
|
|
=======
|
|
|
|
|
//如果不是第一次运行并且到了更新频率,显示统计信息。
|
|
|
|
|
write_to_testcase(use_mem, q->len);//将测试用例数据写入文件。
|
|
|
|
|
|
|
|
|
|
fault = run_target(argv, use_tmout);//运行目标程序并获取执行结果。
|
|
|
|
|
|
|
|
|
|
/* stop_soon is set by the handler for Ctrl+C. When it's pressed,
|
|
|
|
|
we want to bail out quickly. */
|
|
|
|
|
|
|
|
|
|
if (stop_soon || fault != crash_mode) goto abort_calibration;//如果用户请求停止或者执行结果不是崩溃模式,则跳到校准中止。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
|
|
|
|
|
// 如果不是“dumb”模式,并且是第一次校准,并且没有新的代码覆盖,则设置错误为FAULT_NOINST
|
|
|
|
|
if (!dumb_mode && !stage_cur && !count_bytes(trace_bits)) {
|
|
|
|
|
//如果不是“dumb”模式,并且是第一次校准,并且没有新的代码覆盖,则设置错误为FAULT_NOINST并跳到校准中止。
|
|
|
|
|
fault = FAULT_NOINST;
|
|
|
|
|
goto abort_calibration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 计算当前trace bits的哈希值,并与队列条目的执行校验和比较
|
|
|
|
|
cksum = hash32(trace_bits, MAP_SIZE, HASH_CONST);
|
|
|
|
|
if (q->exec_cksum != cksum) {
|
|
|
|
@ -2627,6 +2671,19 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
if (q->exec_cksum) {
|
|
|
|
|
u32 i;
|
|
|
|
|
// 对于每个不同的字节,将其标记为变量字节,并增加校准周期
|
|
|
|
|
=======
|
|
|
|
|
cksum = hash32(trace_bits, MAP_SIZE, HASH_CONST);//计算当前trace bits的哈希值,并与队列条目的执行校验和比较。
|
|
|
|
|
|
|
|
|
|
if (q->exec_cksum != cksum) {
|
|
|
|
|
//如果有新的bits被设置,则更新new_bits。
|
|
|
|
|
hnb = has_new_bits(virgin_bits);
|
|
|
|
|
if (hnb > new_bits) new_bits = hnb;
|
|
|
|
|
|
|
|
|
|
if (q->exec_cksum) {//如果队列条目之前有执行校验和,则检查变量字节。
|
|
|
|
|
|
|
|
|
|
u32 i;
|
|
|
|
|
//对于每个不同的字节,将其标记为变量字节,并增加校准周期。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
for (i = 0; i < MAP_SIZE; i++) {
|
|
|
|
|
if (!var_bytes[i] && first_trace[i] != trace_bits[i]) {
|
|
|
|
|
var_bytes[i] = 1;
|
|
|
|
@ -2634,6 +2691,10 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var_detected = 1;
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
=======
|
|
|
|
|
//如果队列条目之前没有执行校验和,则更新其执行校验和并复制当前trace bits。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
} else {
|
|
|
|
|
// 如果队列条目之前没有执行校验和,则更新其执行校验和并复制当前trace bits
|
|
|
|
|
q->exec_cksum = cksum;
|
|
|
|
@ -2645,6 +2706,7 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
// 计时结束
|
|
|
|
|
stop_us = get_cur_time_us();
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 更新总校准时间和周期
|
|
|
|
|
total_cal_us += stop_us - start_us;
|
|
|
|
|
total_cal_cycles += stage_max;
|
|
|
|
@ -2652,13 +2714,25 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
/* 收集一些关于这个测试用例性能的统计数据。
|
|
|
|
|
这用于在calculate_score()中计算fuzzing的空中时间。 */
|
|
|
|
|
// 更新队列条目的执行时间、位图大小和校准失败计数
|
|
|
|
|
=======
|
|
|
|
|
total_cal_us += stop_us - start_us;//更新总校准时间和周期。
|
|
|
|
|
total_cal_cycles += stage_max;
|
|
|
|
|
|
|
|
|
|
/* OK, let's collect some stats about the performance of this test case.
|
|
|
|
|
This is used for fuzzing air time calculations in calculate_score(). */
|
|
|
|
|
//更新队列条目的执行时间、位图大小和校准失败计数。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
q->exec_us = (stop_us - start_us) / stage_max;
|
|
|
|
|
q->bitmap_size = count_bytes(trace_bits);
|
|
|
|
|
q->handicap = handicap;
|
|
|
|
|
q->cal_failed = 0;
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 更新总位图大小和条目数
|
|
|
|
|
total_bitmap_size += q->bitmap_size;
|
|
|
|
|
=======
|
|
|
|
|
total_bitmap_size += q->bitmap_size;//更新总位图大小和条目数
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
total_bitmap_entries++;
|
|
|
|
|
|
|
|
|
|
// 更新位图得分
|
|
|
|
@ -2669,7 +2743,11 @@ static u8 calibrate_case(char** argv, struct queue_entry* q, u8* use_mem,
|
|
|
|
|
if (!dumb_mode && first_run && !fault && !new_bits) fault = FAULT_NOBITS;
|
|
|
|
|
|
|
|
|
|
abort_calibration:
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 如果有新的bits被设置并且队列条目之前没有新覆盖,则更新队列条目的新覆盖标志
|
|
|
|
|
=======
|
|
|
|
|
//如果有新的bits被设置并且队列条目之前没有新覆盖,则更新队列条目的新覆盖标志。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
if (new_bits == 2 && !q->has_new_cov) {
|
|
|
|
|
q->has_new_cov = 1;
|
|
|
|
|
queued_with_cov++;
|
|
|
|
@ -2677,20 +2755,32 @@ abort_calibration:
|
|
|
|
|
|
|
|
|
|
/* 标记可变路径。 */
|
|
|
|
|
if (var_detected) {
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 如果检测到变量行为,则标记队列条目
|
|
|
|
|
=======
|
|
|
|
|
//如果检测到变量行为,则标记队列条目。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
var_byte_count = count_bytes(var_bytes);
|
|
|
|
|
if (!q->var_behavior) {
|
|
|
|
|
mark_as_variable(q);
|
|
|
|
|
queued_variable++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 恢复旧的状态值
|
|
|
|
|
=======
|
|
|
|
|
//恢复旧的状态值。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
stage_name = old_sn;
|
|
|
|
|
stage_cur = old_sc;
|
|
|
|
|
stage_max = old_sm;
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
|
|
|
// 如果校准中止,则跳到函数末尾
|
|
|
|
|
if (!first_run) show_stats();
|
|
|
|
|
=======
|
|
|
|
|
if (!first_run) show_stats();//如果校准中止,则跳到函数末尾。
|
|
|
|
|
>>>>>>> 78837268ef8db0dafd64b331e2b9f6380dbb1090
|
|
|
|
|
|
|
|
|
|
// 返回错误代码
|
|
|
|
|
return fault;
|
|
|
|
|