Merge branch 'develop_ShangShuo' of https://bdgit.educoder.net/m5cn9itjr/AFL into develop_ShangShuo

# Conflicts:
#	src/afl-fuzz.c
develop_ShangShuo
yangguangmamama 3 months ago
commit 4740587b36

@ -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+Cstop_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;

Loading…
Cancel
Save