diff --git a/src/afl-fuzz.c b/src/afl-fuzz.c index af24a42..21129b0 100644 --- a/src/afl-fuzz.c +++ b/src/afl-fuzz.c @@ -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;