| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -1895,196 +1895,132 @@ param_st parse_fsanitize(aflcc_state_t *aflcc, u8 *cur_argv, u8 scan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  these have_*, otherwise they may not work as expected.
 | 
					 | 
					 | 
					 | 
					  these have_*, otherwise they may not work as expected.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					*/
 | 
					 | 
					 | 
					 | 
					*/
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void add_sanitizers(aflcc_state_t *aflcc, char **envp) {
 | 
					 | 
					 | 
					 | 
					void add_sanitizers(aflcc_state_t *aflcc, char **envp) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					<<<<<<< HEAD
 | 
					 | 
					 | 
					 | 
					  // 如果启用了 ASAN (地址消毒器),则进行相关配置
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_ASAN") || aflcc->have_asan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_MSAN") || aflcc->have_msan)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and AFL_HARDEN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (aflcc->compiler_mode == GCC_PLUGIN && !aflcc->have_staticasan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-static-libasan");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    add_defs_fortify(aflcc, 0);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_asan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize=address");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-common");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_asan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_ASAN") || aflcc->have_asan)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("MSAN and AFL_HARDEN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    add_defs_fortify(aflcc, 0);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_msan) { insert_param(aflcc, "-fsanitize=memory"); }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_msan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_UBSAN") || aflcc->have_ubsan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_ubsan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize=undefined");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize-undefined-trap-on-error");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-sanitize-recover=all");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_fp) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-omit-frame-pointer");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      aflcc->have_fp = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_ubsan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_TSAN") || aflcc->have_tsan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_fp) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-omit-frame-pointer");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      aflcc->have_fp = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_tsan) { insert_param(aflcc, "-fsanitize=thread"); }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_tsan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_LSAN") && !aflcc->have_lsan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fsanitize=leak");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    add_defs_lsan_ctrl(aflcc);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_lsan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_CFISAN") || aflcc->have_cfisan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (aflcc->compiler_mode == GCC_PLUGIN || aflcc->compiler_mode == GCC) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->have_fcf) { insert_param(aflcc, "-fcf-protection=full"); }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } else {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->lto_mode && !aflcc->have_flto) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        uint32_t i = 0, found = 0;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        while (envp[i] != NULL && !found) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          if (strncmp("-flto", envp[i++], 5) == 0) found = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (!found) { insert_param(aflcc, "-flto"); }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        aflcc->have_flto = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->have_cfisan) { insert_param(aflcc, "-fsanitize=cfi"); }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->have_hidden) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        insert_param(aflcc, "-fvisibility=hidden");
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        aflcc->have_hidden = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      aflcc->have_cfisan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					=======
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_ASAN") || aflcc->have_asan) {
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_ASAN") || aflcc->have_asan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果同时启用了 MSAN (内存消毒器),则报错,因为 ASAN 和 MSAN 不能同时使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_MSAN") || aflcc->have_msan)
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_MSAN") || aflcc->have_msan)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果启用了 AFL_HARDEN,则报错,因为 ASAN 和 AFL_HARDEN 不能同时使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and AFL_HARDEN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("ASAN and AFL_HARDEN are mutually exclusive");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果是 GCC 插件模式,并且没有启用静态 ASAN 库,则添加静态 ASAN 库的选项
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (aflcc->compiler_mode == GCC_PLUGIN && !aflcc->have_staticasan) {
 | 
					 | 
					 | 
					 | 
					    if (aflcc->compiler_mode == GCC_PLUGIN && !aflcc->have_staticasan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-static-libasan");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-static-libasan");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 添加 fortify 配置,0表示没有额外的强化
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    add_defs_fortify(aflcc, 0);
 | 
					 | 
					 | 
					 | 
					    add_defs_fortify(aflcc, 0);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_asan) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果没有启用 ASAN,则添加相应的编译选项来启用地址消毒
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_asan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize=address");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize=address");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-common");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-common");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_asan = 1;
 | 
					 | 
					 | 
					 | 
					    aflcc->have_asan = 1;  // 标记已经启用了 ASAN
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					  } 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
 | 
					 | 
					 | 
					 | 
					  // 如果启用了 MSAN (内存消毒器),则进行相关配置
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  else if (getenv("AFL_USE_MSAN") || aflcc->have_msan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果同时启用了 ASAN,则报错,因为 ASAN 和 MSAN 不能同时使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_ASAN") || aflcc->have_asan)
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_ASAN") || aflcc->have_asan)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果启用了 AFL_HARDEN,则报错,因为 MSAN 和 AFL_HARDEN 不能同时使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("MSAN and AFL_HARDEN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("MSAN and AFL_HARDEN are mutually exclusive");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 添加 fortify 配置,0表示没有额外的强化
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    add_defs_fortify(aflcc, 0);
 | 
					 | 
					 | 
					 | 
					    add_defs_fortify(aflcc, 0);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果没有启用 MSAN,则添加相应的编译选项来启用内存消毒
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_msan) { insert_param(aflcc, "-fsanitize=memory"); }
 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_msan) { insert_param(aflcc, "-fsanitize=memory"); }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_msan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    aflcc->have_msan = 1;  // 标记已经启用了 MSAN
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果启用了 UBSAN (未定义行为消毒器),则进行相关配置
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_UBSAN") || aflcc->have_ubsan) {
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_UBSAN") || aflcc->have_ubsan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果没有启用 UBSAN,则添加相应的编译选项来启用未定义行为消毒
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_ubsan) {
 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_ubsan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize=undefined");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize=undefined");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize-undefined-trap-on-error");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fsanitize-undefined-trap-on-error");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-sanitize-recover=all");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-sanitize-recover=all");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果没有启用帧指针,则添加相应的选项来启用帧指针
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_fp) {
 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_fp) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-omit-frame-pointer");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-omit-frame-pointer");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      aflcc->have_fp = 1;
 | 
					 | 
					 | 
					 | 
					      aflcc->have_fp = 1;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_ubsan = 1;
 | 
					 | 
					 | 
					 | 
					    aflcc->have_ubsan = 1;  // 标记已经启用了 UBSAN
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果启用了 TSAN (线程消毒器),则进行相关配置
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_TSAN") || aflcc->have_tsan) {
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_TSAN") || aflcc->have_tsan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果没有启用帧指针,则添加相应的选项来启用帧指针
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_fp) {
 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_fp) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-omit-frame-pointer");
 | 
					 | 
					 | 
					 | 
					      insert_param(aflcc, "-fno-omit-frame-pointer");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      aflcc->have_fp = 1;
 | 
					 | 
					 | 
					 | 
					      aflcc->have_fp = 1;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果没有启用 TSAN,则添加相应的编译选项来启用线程消毒
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_tsan) { insert_param(aflcc, "-fsanitize=thread"); }
 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_tsan) { insert_param(aflcc, "-fsanitize=thread"); }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_tsan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    aflcc->have_tsan = 1;  // 标记已经启用了 TSAN
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果启用了 LSAN (泄漏消毒器),则进行相关配置
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_LSAN") && !aflcc->have_lsan) {
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_LSAN") && !aflcc->have_lsan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 添加编译选项来启用泄漏消毒
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fsanitize=leak");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fsanitize=leak");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 添加 LSAN 控制的定义
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    add_defs_lsan_ctrl(aflcc);
 | 
					 | 
					 | 
					 | 
					    add_defs_lsan_ctrl(aflcc);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    aflcc->have_lsan = 1;
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    
 | 
					 | 
					 | 
					 | 
					    
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    aflcc->have_lsan = 1;  // 标记已经启用了 LSAN
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果启用了 CFISAN (控制流完整性消毒器),则进行相关配置
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_CFISAN") || aflcc->have_cfisan) {
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_USE_CFISAN") || aflcc->have_cfisan) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果是 GCC 插件模式或 GCC 模式,则启用完整的控制流保护
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (aflcc->compiler_mode == GCC_PLUGIN || aflcc->compiler_mode == GCC) {
 | 
					 | 
					 | 
					 | 
					    if (aflcc->compiler_mode == GCC_PLUGIN || aflcc->compiler_mode == GCC) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      // 如果没有启用控制流保护,则添加相应选项
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->have_fcf) { insert_param(aflcc, "-fcf-protection=full"); }
 | 
					 | 
					 | 
					 | 
					      if (!aflcc->have_fcf) { insert_param(aflcc, "-fcf-protection=full"); }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } else {
 | 
					 | 
					 | 
					 | 
					    } else {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      // 如果没有启用 LTO (链接时优化),则添加 LTO 选项
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->lto_mode && !aflcc->have_flto) {
 | 
					 | 
					 | 
					 | 
					      if (!aflcc->lto_mode && !aflcc->have_flto) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        uint32_t i = 0, found = 0;
 | 
					 | 
					 | 
					 | 
					        uint32_t i = 0, found = 0;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        while (envp[i] != NULL && !found) {
 | 
					 | 
					 | 
					 | 
					        while (envp[i] != NULL && !found) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          if (strncmp("-flto", envp[i++], 5) == 0) found = 1;
 | 
					 | 
					 | 
					 | 
					          if (strncmp("-flto", envp[i++], 5) == 0) found = 1;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        }
 | 
					 | 
					 | 
					 | 
					        }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        if (!found) { insert_param(aflcc, "-flto"); }
 | 
					 | 
					 | 
					 | 
					        if (!found) { insert_param(aflcc, "-flto"); }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        aflcc->have_flto = 1;
 | 
					 | 
					 | 
					 | 
					        aflcc->have_flto = 1;  // 标记已经启用了 LTO
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      }
 | 
					 | 
					 | 
					 | 
					      }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      // 如果没有启用 CFISAN,则添加相应选项来启用控制流完整性消毒
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->have_cfisan) { insert_param(aflcc, "-fsanitize=cfi"); }
 | 
					 | 
					 | 
					 | 
					      if (!aflcc->have_cfisan) { insert_param(aflcc, "-fsanitize=cfi"); }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      // 如果没有启用隐藏符号,则启用隐藏符号选项
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!aflcc->have_hidden) {
 | 
					 | 
					 | 
					 | 
					      if (!aflcc->have_hidden) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        insert_param(aflcc, "-fvisibility=hidden");
 | 
					 | 
					 | 
					 | 
					        insert_param(aflcc, "-fvisibility=hidden");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        aflcc->have_hidden = 1;
 | 
					 | 
					 | 
					 | 
					        aflcc->have_hidden = 1;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      }
 | 
					 | 
					 | 
					 | 
					      }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      aflcc->have_cfisan = 1;
 | 
					 | 
					 | 
					 | 
					      aflcc->have_cfisan = 1;  // 标记已经启用了 CFISAN
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					>>>>>>> e12b99bad19de97a02e9fe14b9b2c048338b2ab7
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/* Add params to enable LLVM SanCov, the native PCGUARD */
 | 
					 | 
					 | 
					 | 
					/* Add params to enable LLVM SanCov, the native PCGUARD */
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -2635,10 +2571,13 @@ void add_gcc_plugin(aflcc_state_t *aflcc) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/* Add some miscellaneous params required by our instrumentation. */
 | 
					 | 
					 | 
					 | 
					/* Add some miscellaneous params required by our instrumentation. */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					void add_misc_params(aflcc_state_t *aflcc) {
 | 
					 | 
					 | 
					 | 
					void add_misc_params(aflcc_state_t *aflcc) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果环境变量 AFl_NO_BUILTIN 或其他相关环境变量被设置,或者启用了 LTO 模式
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 则禁用内置的字符串和内存比较函数
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_NO_BUILTIN") || getenv("AFL_LLVM_LAF_TRANSFORM_COMPARES") ||
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_NO_BUILTIN") || getenv("AFL_LLVM_LAF_TRANSFORM_COMPARES") ||
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      getenv("AFL_LLVM_LAF_ALL") || getenv("AFL_LLVM_CMPLOG") ||
 | 
					 | 
					 | 
					 | 
					      getenv("AFL_LLVM_LAF_ALL") || getenv("AFL_LLVM_CMPLOG") ||
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      aflcc->lto_mode) {
 | 
					 | 
					 | 
					 | 
					      aflcc->lto_mode) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 禁用常见的字符串和内存比较函数的内置实现,防止与模糊测试产生冲突
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fno-builtin-strcmp");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fno-builtin-strcmp");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fno-builtin-strncmp");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fno-builtin-strncmp");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fno-builtin-strcasecmp");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fno-builtin-strcasecmp");
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -2650,31 +2589,46 @@ void add_misc_params(aflcc_state_t *aflcc) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (!aflcc->have_pic) { insert_param(aflcc, "-fPIC"); }
 | 
					 | 
					 | 
					 | 
					  // 如果没有启用位置无关代码(PIC),则添加 -fPIC 参数
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  if (!aflcc->have_pic) { 
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fPIC"); 
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果环境变量 AFL_HARDEN 被设置,启用栈保护等安全选项
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_HARDEN")) {
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_HARDEN")) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 启用所有函数的栈保护
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fstack-protector-all");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-fstack-protector-all");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->fortify_set) add_defs_fortify(aflcc, 2);
 | 
					 | 
					 | 
					 | 
					    // 如果未设置 Fortify,设置 Fortify 防护等级
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    if (!aflcc->fortify_set) 
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        add_defs_fortify(aflcc, 2);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果环境变量 AFL_DONT_OPTIMIZE 未设置,启用优化选项
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (!getenv("AFL_DONT_OPTIMIZE")) {
 | 
					 | 
					 | 
					 | 
					  if (!getenv("AFL_DONT_OPTIMIZE")) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 启用调试符号生成
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-g");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-g");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_o) insert_param(aflcc, "-O3");
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!aflcc->have_unroll) insert_param(aflcc, "-funroll-loops");
 | 
					 | 
					 | 
					 | 
					    // 如果没有设置 -O 优化级别,设置为 -O3(最高优化)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_o) 
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        insert_param(aflcc, "-O3");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 如果没有设置循环展开,启用循环展开优化
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if (!aflcc->have_unroll) 
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        insert_param(aflcc, "-funroll-loops");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    // 以下代码被注释掉了,但如果有指定架构优化选项(如 -march),也可以启用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    // if (strlen(aflcc->march_opt) > 1 && aflcc->march_opt[0] == '-')
 | 
					 | 
					 | 
					 | 
					    // if (strlen(aflcc->march_opt) > 1 && aflcc->march_opt[0] == '-')
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    //     insert_param(aflcc, aflcc->march_opt);
 | 
					 | 
					 | 
					 | 
					    //     insert_param(aflcc, aflcc->march_opt);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  // 如果设置了 x_set 标志,插入 -x none 参数
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (aflcc->x_set) {
 | 
					 | 
					 | 
					 | 
					  if (aflcc->x_set) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-x");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "-x");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    insert_param(aflcc, "none");
 | 
					 | 
					 | 
					 | 
					    insert_param(aflcc, "none");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -3659,50 +3613,86 @@ static void edit_params(aflcc_state_t *aflcc, u32 argc, char **argv,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/* Main entry point */
 | 
					 | 
					 | 
					 | 
					/* Main entry point */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					int main(int argc, char **argv, char **envp) {
 | 
					 | 
					 | 
					 | 
					classDiagram
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    class AFLCCMain {
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  aflcc_state_t *aflcc = malloc(sizeof(aflcc_state_t));
 | 
					 | 
					 | 
					 | 
					        +main(argc, argv, envp) 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  aflcc_state_init(aflcc, (u8 *)argv[0]);
 | 
					 | 
					 | 
					 | 
					        +initializeState() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					        +checkEnvironmentVariables() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  check_environment_vars(envp);
 | 
					 | 
					 | 
					 | 
					        +findDependencies() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					        +determineCompilerMode() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  find_built_deps(aflcc);
 | 
					 | 
					 | 
					 | 
					        +determineInstrumentationMode() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					        +finalizeMode() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  compiler_mode_by_callname(aflcc);
 | 
					 | 
					 | 
					 | 
					        +processParameters() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  compiler_mode_by_environ(aflcc);
 | 
					 | 
					 | 
					 | 
					        +maybeShowUsage() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  compiler_mode_by_cmdline(aflcc, argc, argv);
 | 
					 | 
					 | 
					 | 
					        +notifyMode() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					        +debugArguments() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  instrument_mode_by_environ(aflcc);
 | 
					 | 
					 | 
					 | 
					        +editParameters() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					        +executeCompiler() 
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  mode_final_checkout(aflcc, argc, argv);
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  process_params(aflcc, 1, argc, argv);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  maybe_usage(aflcc, argc, argv);
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  mode_notification(aflcc);
 | 
					 | 
					 | 
					 | 
					    class AFLCCState {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        -cc_params: char**
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        -cc_par_cnt: u32
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        -passthrough: u8
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        -debug: u8
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +aflcc_state_init(state, prog_name)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (aflcc->debug) debugf_args(argc, argv);
 | 
					 | 
					 | 
					 | 
					    class EnvironmentChecker {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +check_environment_vars(envp)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  edit_params(aflcc, argc, argv, envp);
 | 
					 | 
					 | 
					 | 
					    class DependencyFinder {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +find_built_deps(aflcc)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (aflcc->debug)
 | 
					 | 
					 | 
					 | 
					    class CompilerModeHandler {
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    debugf_args((s32)aflcc->cc_par_cnt, (char **)aflcc->cc_params);
 | 
					 | 
					 | 
					 | 
					        +compiler_mode_by_callname(aflcc)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +compiler_mode_by_environ(aflcc)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +compiler_mode_by_cmdline(aflcc, argc, argv)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (aflcc->passthrough) {
 | 
					 | 
					 | 
					 | 
					    class InstrumentationModeHandler {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +instrument_mode_by_environ(aflcc)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    argv[0] = aflcc->cc_params[0];
 | 
					 | 
					 | 
					 | 
					    class ModeFinalizer {
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    execvp(aflcc->cc_params[0], (char **)argv);
 | 
					 | 
					 | 
					 | 
					        +mode_final_checkout(aflcc, argc, argv)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else {
 | 
					 | 
					 | 
					 | 
					    class ParameterProcessor {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +process_params(aflcc, start_idx, argc, argv)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    execvp(aflcc->cc_params[0], (char **)aflcc->cc_params);
 | 
					 | 
					 | 
					 | 
					    class UsageNotifier {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +maybe_usage(aflcc, argc, argv)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    class ModeNotifier {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +mode_notification(aflcc)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  FATAL("Oops, failed to execute '%s' - check your PATH", aflcc->cc_params[0]);
 | 
					 | 
					 | 
					 | 
					    class Debugger {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +debugf_args(argc, argv)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return 0;
 | 
					 | 
					 | 
					 | 
					    class ParameterEditor {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +edit_params(aflcc, argc, argv, envp)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    class Executor {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        +execute_compiler(aflcc, argv)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> AFLCCState : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> EnvironmentChecker : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> DependencyFinder : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> CompilerModeHandler : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> InstrumentationModeHandler : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> ModeFinalizer : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> ParameterProcessor : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> UsageNotifier : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> ModeNotifier : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> Debugger : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> ParameterEditor : 使用
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    AFLCCMain --> Executor : 使用
 |