| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -14,6 +14,8 @@
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  limitations under the License.
 | 
					 | 
					 | 
					 | 
					  limitations under the License.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					*/
 | 
					 | 
					 | 
					 | 
					*/
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// 这部分是版权声明和许可证信息,说明这个文件是在Apache License 2.0下发布的。
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/*
 | 
					 | 
					 | 
					 | 
					/*
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					   american fuzzy lop - wrapper for GCC and clang
 | 
					 | 
					 | 
					 | 
					   american fuzzy lop - wrapper for GCC and clang
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					   ----------------------------------------------
 | 
					 | 
					 | 
					 | 
					   ----------------------------------------------
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -38,7 +40,7 @@
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					   specify its location via AFL_CC or AFL_CXX.
 | 
					 | 
					 | 
					 | 
					   specify its location via AFL_CC or AFL_CXX.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					*/
 | 
					 | 
					 | 
					 | 
					*/
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					// 这部分是注释,提供了关于这个程序的概述和使用说明。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#define AFL_MAIN
 | 
					 | 
					 | 
					 | 
					#define AFL_MAIN
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include "config.h"
 | 
					 | 
					 | 
					 | 
					#include "config.h"
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -51,6 +53,8 @@
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <stdlib.h>
 | 
					 | 
					 | 
					 | 
					#include <stdlib.h>
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <string.h>
 | 
					 | 
					 | 
					 | 
					#include <string.h>
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// 这些是包含的头文件,其中一些是AFL自己的头文件,其他的是C标准库的头文件
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static u8*  as_path;                /* Path to the AFL 'as' wrapper      */
 | 
					 | 
					 | 
					 | 
					static u8*  as_path;                /* Path to the AFL 'as' wrapper      */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static u8** cc_params;              /* Parameters passed to the real CC  */
 | 
					 | 
					 | 
					 | 
					static u8** cc_params;              /* Parameters passed to the real CC  */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static u32  cc_par_cnt = 1;         /* Param count, including argv0      */
 | 
					 | 
					 | 
					 | 
					static u32  cc_par_cnt = 1;         /* Param count, including argv0      */
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -58,11 +62,14 @@ static u8   be_quiet,               /* Quiet mode                        */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            clang_mode;             /* Invoked as afl-clang*?            */
 | 
					 | 
					 | 
					 | 
					            clang_mode;             /* Invoked as afl-clang*?            */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// 这些是全局变量声明。`as_path`存储AFL汇编器的路径,`cc_params`存储传递给实际编译器的参数,`cc_par_cnt`是参数计数器,`be_quiet`用于控制
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// 是否静默模式,`clang_mode`指示是否以`afl-clang`或`afl-clang++`模式调用。
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/* Try to find our "fake" GNU assembler in AFL_PATH or at the location derived
 | 
					 | 
					 | 
					 | 
					/* Try to find our "fake" GNU assembler in AFL_PATH or at the location derived
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					   from argv[0]. If that fails, abort. */
 | 
					 | 
					 | 
					 | 
					   from argv[0]. If that fails, abort. */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static void find_as(u8* argv0) {
 | 
					 | 
					 | 
					 | 
					static void find_as(u8* argv0) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					// 这个函数尝试在AFL_PATH环境变量指定的路径或从argv[0]派生的路径中找到AFL的“假”GNU汇编器。如果找不到,程序将终止。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  u8 *afl_path = getenv("AFL_PATH");
 | 
					 | 
					 | 
					 | 
					  u8 *afl_path = getenv("AFL_PATH");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  u8 *slash, *tmp;
 | 
					 | 
					 | 
					 | 
					  u8 *slash, *tmp;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -116,31 +123,32 @@ static void find_as(u8* argv0) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/* Copy argv to cc_params, making the necessary edits. */
 | 
					 | 
					 | 
					 | 
					/* Copy argv to cc_params, making the necessary edits. */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					static void edit_params(u32 argc, char** argv) {
 | 
					 | 
					 | 
					 | 
					static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  //定义了一个函数edit_params,它接受两个参数:argc是参数的数量,argv是参数的数组。
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  u8 fortify_set = 0, asan_set = 0;
 | 
					 | 
					 | 
					 | 
					  u8 fortify_set = 0, asan_set = 0;//声明两个变量fortify_set和asan_set,用于跟踪是否已经设置了FORTIFY_SOURCE和address sanitizer(ASan)标志
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  u8 *name;
 | 
					 | 
					 | 
					 | 
					  u8 *name;//用于存储程序的名称
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#if defined(__FreeBSD__) && defined(__x86_64__)
 | 
					 | 
					 | 
					 | 
					#if defined(__FreeBSD__) && defined(__x86_64__)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  u8 m32_set = 0;
 | 
					 | 
					 | 
					 | 
					  u8 m32_set = 0;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#endif
 | 
					 | 
					 | 
					 | 
					#endif
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cc_params = ck_alloc((argc + 128) * sizeof(u8*));
 | 
					 | 
					 | 
					 | 
					  cc_params = ck_alloc((argc + 128) * sizeof(u8*));//分配内存以存储修改后的参数列表,大小为argc + 128个u8*类型的指针。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  name = strrchr(argv[0], '/');
 | 
					 | 
					 | 
					 | 
					  name = strrchr(argv[0], '/');//找到argv[0](程序的路径)中最后一个'/'字符,这通常用于获取程序的名称。
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (!name) name = argv[0]; else name++;
 | 
					 | 
					 | 
					 | 
					  if (!name) name = argv[0]; else name++;//如果name为NULL(即argv[0]中没有'/'),则name指向argv[0]的开始。否则,name向前移动一个字符,跳过'/'。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (!strncmp(name, "afl-clang", 9)) {
 | 
					 | 
					 | 
					 | 
					  if (!strncmp(name, "afl-clang", 9)) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    clang_mode = 1;
 | 
					 | 
					 | 
					 | 
					    clang_mode = 1;//检查程序名称是否以"afl-clang"开头,如果是,设置clang_mode标志为1
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    setenv(CLANG_ENV_VAR, "1", 1);
 | 
					 | 
					 | 
					 | 
					    setenv(CLANG_ENV_VAR, "1", 1);//设置环境变量CLANG_ENV_VAR为"1",这可能用于通知其他部分的AFL工具链正在使用Clang。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strcmp(name, "afl-clang++")) {
 | 
					 | 
					 | 
					 | 
					    if (!strcmp(name, "afl-clang++")) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      u8* alt_cxx = getenv("AFL_CXX");
 | 
					 | 
					 | 
					 | 
					      u8* alt_cxx = getenv("AFL_CXX");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      cc_params[0] = alt_cxx ? alt_cxx : (u8*)"clang++";
 | 
					 | 
					 | 
					 | 
					      cc_params[0] = alt_cxx ? alt_cxx : (u8*)"clang++";//如果AFL_CXX设置,将其值作为第一个参数;否则,使用"clang++"。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } else {
 | 
					 | 
					 | 
					 | 
					    } else {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      u8* alt_cc = getenv("AFL_CC");
 | 
					 | 
					 | 
					 | 
					      u8* alt_cc = getenv("AFL_CC");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      cc_params[0] = alt_cc ? alt_cc : (u8*)"clang";
 | 
					 | 
					 | 
					 | 
					      cc_params[0] = alt_cc ? alt_cc : (u8*)"clang";//否则尝试获取环境变量AFL_CC的值。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else {
 | 
					 | 
					 | 
					 | 
					  } else {
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -152,13 +160,13 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					       binaries. Meh. */
 | 
					 | 
					 | 
					 | 
					       binaries. Meh. */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#ifdef __APPLE__
 | 
					 | 
					 | 
					 | 
					#ifdef __APPLE__
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    //在Apple系统上,根据程序名称设置不同的编译器。如果AFL_CXX、AFL_GCJ或AFL_CC环境变量设置,使用它们的值;否则,使用默认的编译器名称
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strcmp(name, "afl-g++")) cc_params[0] = getenv("AFL_CXX");
 | 
					 | 
					 | 
					 | 
					    if (!strcmp(name, "afl-g++")) cc_params[0] = getenv("AFL_CXX");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else if (!strcmp(name, "afl-gcj")) cc_params[0] = getenv("AFL_GCJ");
 | 
					 | 
					 | 
					 | 
					    else if (!strcmp(name, "afl-gcj")) cc_params[0] = getenv("AFL_GCJ");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else cc_params[0] = getenv("AFL_CC");
 | 
					 | 
					 | 
					 | 
					    else cc_params[0] = getenv("AFL_CC");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!cc_params[0]) {
 | 
					 | 
					 | 
					 | 
					    if (!cc_params[0]) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					      //输出错误信息,指出在MacOS X上需要设置AFL_CC或AFL_CXX环境变量。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      SAYF("\n" cLRD "[-] " cRST
 | 
					 | 
					 | 
					 | 
					      SAYF("\n" cLRD "[-] " cRST
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					           "On Apple systems, 'gcc' is usually just a wrapper for clang. Please use the\n"
 | 
					 | 
					 | 
					 | 
					           "On Apple systems, 'gcc' is usually just a wrapper for clang. Please use the\n"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					           "    'afl-clang' utility instead of 'afl-gcc'. If you really have GCC installed,\n"
 | 
					 | 
					 | 
					 | 
					           "    'afl-clang' utility instead of 'afl-gcc'. If you really have GCC installed,\n"
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -169,7 +177,7 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#else
 | 
					 | 
					 | 
					 | 
					#else
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    //对于非Apple系统,根据程序名称设置不同的编译器。如果相应的环境变量设置,使用它们的值;否则,使用默认的编译器名称。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strcmp(name, "afl-g++")) {
 | 
					 | 
					 | 
					 | 
					    if (!strcmp(name, "afl-g++")) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      u8* alt_cxx = getenv("AFL_CXX");
 | 
					 | 
					 | 
					 | 
					      u8* alt_cxx = getenv("AFL_CXX");
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      cc_params[0] = alt_cxx ? alt_cxx : (u8*)"g++";
 | 
					 | 
					 | 
					 | 
					      cc_params[0] = alt_cxx ? alt_cxx : (u8*)"g++";
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -188,27 +196,27 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  while (--argc) {
 | 
					 | 
					 | 
					 | 
					  while (--argc) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    u8* cur = *(++argv);
 | 
					 | 
					 | 
					 | 
					    u8* cur = *(++argv);
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strncmp(cur, "-B", 2)) {
 | 
					 | 
					 | 
					 | 
					    if (!strncmp(cur, "-B", 2)) {//如果当前参数以"-B"开头,输出警告信息,并跳过后续参数(如果当前参数后面紧跟着的是编译器的路径)。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!be_quiet) WARNF("-B is already set, overriding");
 | 
					 | 
					 | 
					 | 
					      if (!be_quiet) WARNF("-B is already set, overriding");//如果程序不在静默模式,输出警告信息。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (!cur[2] && argc > 1) { argc--; argv++; }
 | 
					 | 
					 | 
					 | 
					      if (!cur[2] && argc > 1) { argc--; argv++; }//如果-B后面紧跟着的是编译器的路径,跳过这个路径。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      continue;
 | 
					 | 
					 | 
					 | 
					      continue;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    }
 | 
					 | 
					 | 
					 | 
					    }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-integrated-as")) continue;
 | 
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-integrated-as")) continue;//如果参数是"-integrated-as",跳过它。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-pipe")) continue;
 | 
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-pipe")) continue;//如果参数是"-pipe",跳过它。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#if defined(__FreeBSD__) && defined(__x86_64__)
 | 
					 | 
					 | 
					 | 
					#if defined(__FreeBSD__) && defined(__x86_64__)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-m32")) m32_set = 1;
 | 
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-m32")) m32_set = 1;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#endif
 | 
					 | 
					 | 
					 | 
					#endif
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-fsanitize=address") ||
 | 
					 | 
					 | 
					 | 
					    if (!strcmp(cur, "-fsanitize=address") ||
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        !strcmp(cur, "-fsanitize=memory")) asan_set = 1;
 | 
					 | 
					 | 
					 | 
					        !strcmp(cur, "-fsanitize=memory")) asan_set = 1;//如果参数是"-fsanitize=address"或"-fsanitize=memory",设置asan_set标志。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (strstr(cur, "FORTIFY_SOURCE")) fortify_set = 1;
 | 
					 | 
					 | 
					 | 
					    if (strstr(cur, "FORTIFY_SOURCE")) fortify_set = 1;//如果参数包含"FORTIFY_SOURCE",设置fortify_set标志。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = cur;
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = cur;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -216,9 +224,11 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cc_params[cc_par_cnt++] = "-B";
 | 
					 | 
					 | 
					 | 
					  cc_params[cc_par_cnt++] = "-B";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cc_params[cc_par_cnt++] = as_path;
 | 
					 | 
					 | 
					 | 
					  cc_params[cc_par_cnt++] = as_path;
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					  //向参数列表中添加"-B"和AFL汇编器的路径。
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (clang_mode)
 | 
					 | 
					 | 
					 | 
					  if (clang_mode)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-no-integrated-as";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-no-integrated-as";//如果clang_mode标志设置,向参数列表中添加`"-no-integrated-as"
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (getenv("AFL_HARDEN")) {
 | 
					 | 
					 | 
					 | 
					  if (getenv("AFL_HARDEN")) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -229,38 +239,38 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (asan_set) {
 | 
					 | 
					 | 
					 | 
					  if (asan_set) {//检查是否设置了asan_set标志。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    /* Pass this on to afl-as to adjust map density. */
 | 
					 | 
					 | 
					 | 
					    /* Pass this on to afl-as to adjust map density. */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    setenv("AFL_USE_ASAN", "1", 1);
 | 
					 | 
					 | 
					 | 
					    setenv("AFL_USE_ASAN", "1", 1);//如果设置,设置环境变量AFL_USE_ASAN为"1"
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (getenv("AFL_USE_ASAN")) {
 | 
					 | 
					 | 
					 | 
					  } else if (getenv("AFL_USE_ASAN")) {//如果asan_set标志未设置,但设置了环境变量AFL_USE_ASAN。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_MSAN"))
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_MSAN"))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");//如果同时设置了AFL_USE_MSAN,输出错误信息并终止程序。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and AFL_HARDEN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("ASAN and AFL_HARDEN are mutually exclusive");//如果同时设置了AFL_HARDEN,输出错误信息并终止程序。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fsanitize=address";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fsanitize=address";//向参数列表中添加"-U_FORTIFY_SOURCE"和"-fsanitize=address"。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } else if (getenv("AFL_USE_MSAN")) {
 | 
					 | 
					 | 
					 | 
					  } else if (getenv("AFL_USE_MSAN")) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_ASAN"))
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_USE_ASAN"))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("ASAN and MSAN are mutually exclusive");//如果同时设置了AFL_USE_ASAN,输出错误信息并终止程序。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
					 | 
					 | 
					 | 
					    if (getenv("AFL_HARDEN"))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      FATAL("MSAN and AFL_HARDEN are mutually exclusive");
 | 
					 | 
					 | 
					 | 
					      FATAL("MSAN and AFL_HARDEN are mutually exclusive");//如果同时设置了AFL_HARDEN,输出错误信息并终止程序。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-U_FORTIFY_SOURCE";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fsanitize=memory";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fsanitize=memory";//向参数列表中添加"-U_FORTIFY_SOURCE"和"-fsanitize=memory"。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (!getenv("AFL_DONT_OPTIMIZE")) {
 | 
					 | 
					 | 
					 | 
					  if (!getenv("AFL_DONT_OPTIMIZE")) {//检查是否设置了环境变量AFL_DONT_OPTIMIZE。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#if defined(__FreeBSD__) && defined(__x86_64__)
 | 
					 | 
					 | 
					 | 
					#if defined(__FreeBSD__) && defined(__x86_64__)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -269,22 +279,23 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					       that bug. */
 | 
					 | 
					 | 
					 | 
					       that bug. */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (!clang_mode || !m32_set)
 | 
					 | 
					 | 
					 | 
					    if (!clang_mode || !m32_set)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      cc_params[cc_par_cnt++] = "-g";
 | 
					 | 
					 | 
					 | 
					      cc_params[cc_par_cnt++] = "-g";//如果不是Clang模式或没有设置m32_set标志,向参数列表中添加"-g"。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#else
 | 
					 | 
					 | 
					 | 
					#else
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      cc_params[cc_par_cnt++] = "-g";
 | 
					 | 
					 | 
					 | 
					      cc_params[cc_par_cnt++] = "-g";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#endif
 | 
					 | 
					 | 
					 | 
					#endif//结束#if defined(__FreeBSD__) && defined(__x86_64__)条件编译块。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-O3";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-O3";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-funroll-loops";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-funroll-loops";//向参数列表中添加"-O3"和"-funroll-loops",这些是优化选项。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    /* Two indicators that you're building for fuzzing; one of them is
 | 
					 | 
					 | 
					 | 
					    /* Two indicators that you're building for fuzzing; one of them is
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					       AFL-specific, the other is shared with libfuzzer. */
 | 
					 | 
					 | 
					 | 
					       AFL-specific, the other is shared with libfuzzer. */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-D__AFL_COMPILER=1";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-D__AFL_COMPILER=1";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    //向参数列表中添加两个宏定义,这些宏定义指示编译器代码将用于模糊测试。
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -297,7 +308,7 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fno-builtin-memcmp";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fno-builtin-memcmp";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fno-builtin-strstr";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fno-builtin-strstr";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fno-builtin-strcasestr";
 | 
					 | 
					 | 
					 | 
					    cc_params[cc_par_cnt++] = "-fno-builtin-strcasestr";
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					    //如果设置,向参数列表中添加一系列"-fno-builtin-*"选项,这些选项禁用编译器的内置函数。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  }
 | 
					 | 
					 | 
					 | 
					  }
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  cc_params[cc_par_cnt] = NULL;
 | 
					 | 
					 | 
					 | 
					  cc_params[cc_par_cnt] = NULL;
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -306,7 +317,7 @@ static void edit_params(u32 argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					/* Main entry point */
 | 
					 | 
					 | 
					 | 
					/* Main entry point */
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					//最后是函数结束语,结束函数定义。
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					int main(int argc, char** argv) {
 | 
					 | 
					 | 
					 | 
					int main(int argc, char** argv) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (isatty(2) && !getenv("AFL_QUIET")) {
 | 
					 | 
					 | 
					 | 
					  if (isatty(2) && !getenv("AFL_QUIET")) {
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
 
 |