diff --git a/src/debug.h b/src/debug.h index 5f75974..7f1e35c 100644 --- a/src/debug.h +++ b/src/debug.h @@ -155,54 +155,50 @@ * Misc terminal codes * ***********************/ -#define TERM_HOME "\x1b[H" -#define TERM_CLEAR TERM_HOME "\x1b[2J" -#define cEOL "\x1b[0K" -#define CURSOR_HIDE "\x1b[?25l" -#define CURSOR_SHOW "\x1b[?25h" + // 定义一些额外的终端控制代码 +#define TERM_HOME "\x1b[H" // 移动光标到终端左上角 +#define TERM_CLEAR TERM_HOME "\x1b[2J" // 清除终端屏幕 +#define cEOL "\x1b[0K" // 清除当前行从光标位置到行尾的内容 +#define CURSOR_HIDE "\x1b[?25l" // 隐藏光标 +#define CURSOR_SHOW "\x1b[?25h" // 显示光标 /************************ * Debug & error macros * ************************/ -/* Just print stuff to the appropriate stream. */ - + // 定义一些宏用于调试和错误处理 + // 如果配置中定义了MESSAGES_TO_STDOUT,则使用printf,否则使用fprintf(stderr, ...) #ifdef MESSAGES_TO_STDOUT # define SAYF(x...) printf(x) #else # define SAYF(x...) fprintf(stderr, x) #endif /* ^MESSAGES_TO_STDOUT */ -/* Show a prefixed warning. */ - +// 显示带前缀的警告信息 #define WARNF(x...) do { \ SAYF(cYEL "[!] " cBRI "WARNING: " cRST x); \ SAYF(cRST "\n"); \ } while (0) -/* Show a prefixed "doing something" message. */ - +// 显示带前缀的“正在执行”信息 #define ACTF(x...) do { \ SAYF(cLBL "[*] " cRST x); \ SAYF(cRST "\n"); \ } while (0) -/* Show a prefixed "success" message. */ - +// 显示带前缀的成功信息 #define OKF(x...) do { \ SAYF(cLGN "[+] " cRST x); \ SAYF(cRST "\n"); \ } while (0) -/* Show a prefixed fatal error message (not used in afl). */ - +// 显示带前缀的严重错误信息(不在afl中使用) #define BADF(x...) do { \ SAYF(cLRD "\n[-] " cRST x); \ SAYF(cRST "\n"); \ } while (0) -/* Die with a verbose non-OS fatal error message. */ - +// 以详细非操作系统致命错误消息退出程序 #define FATAL(x...) do { \ SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD "\n[-] PROGRAM ABORT : " \ cBRI x); \ @@ -211,8 +207,7 @@ exit(1); \ } while (0) -/* Die by calling abort() to provide a core dump. */ - +// 通过调用abort()退出程序,以便提供core dump #define ABORT(x...) do { \ SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD "\n[-] PROGRAM ABORT : " \ cBRI x); \ @@ -221,8 +216,7 @@ abort(); \ } while (0) -/* Die while also including the output of perror(). */ - +// 以包含perror()输出的方式退出程序 #define PFATAL(x...) do { \ fflush(stdout); \ SAYF(bSTOP RESET_G1 CURSOR_SHOW cRST cLRD "\n[-] SYSTEM ERROR : " \ @@ -233,16 +227,12 @@ exit(1); \ } while (0) -/* Die with FAULT() or PFAULT() depending on the value of res (used to - interpret different failure modes for read(), write(), etc). */ - +// 根据res的值调用FAULT()或PFAULT(),用于解释read()、write()等的不同失败模式 #define RPFATAL(res, x...) do { \ if (res < 0) PFATAL(x); else FATAL(x); \ } while (0) -/* Error-checking versions of read() and write() that call RPFATAL() as - appropriate. */ - +// 定义ck_write和ck_read宏,用于检查write和read操作是否成功,并在失败时调用RPFATAL #define ck_write(fd, buf, len, fn) do { \ u32 _len = (len); \ s32 _res = write(fd, buf, _len); \ @@ -255,4 +245,4 @@ if (_res != _len) RPFATAL(_res, "Short read from %s", fn); \ } while (0) -#endif /* ! _HAVE_DEBUG_H */ +#endif /* !_HAVE_DEBUG_H */ \ No newline at end of file diff --git a/src/hash.h b/src/hash.h index e17fc8f..31a356d 100644 --- a/src/hash.h +++ b/src/hash.h @@ -31,81 +31,94 @@ Other code written and maintained by Michal Zalewski */ +// 检查_HAVE_HASH_H宏是否已定义,如果没有,则定义它,以防止头文件被重复包含 #ifndef _HAVE_HASH_H #define _HAVE_HASH_H +// 包含types.h头文件,可能包含一些基本类型的定义 #include "types.h" +// 如果编译目标是x86_64架构,则定义64位循环左移宏ROL64 #ifdef __x86_64__ - #define ROL64(_x, _r) ((((u64)(_x)) << (_r)) | (((u64)(_x)) >> (64 - (_r)))) +// 定义一个内联函数hash32,用于计算32位哈希值(x86_64架构专用) static inline u32 hash32(const void* key, u32 len, u32 seed) { - - const u64* data = (u64*)key; - u64 h1 = seed ^ len; - - len >>= 3; - - while (len--) { - - u64 k1 = *data++; - - k1 *= 0x87c37b91114253d5ULL; - k1 = ROL64(k1, 31); - k1 *= 0x4cf5ad432745937fULL; - - h1 ^= k1; - h1 = ROL64(h1, 27); - h1 = h1 * 5 + 0x52dce729; - - } - - h1 ^= h1 >> 33; - h1 *= 0xff51afd7ed558ccdULL; - h1 ^= h1 >> 33; - h1 *= 0xc4ceb9fe1a85ec53ULL; - h1 ^= h1 >> 33; - - return h1; - + // 将key转换为u64指针 + const u64* data = (u64*)key; + // 初始化哈希值h1,种子与长度异或 + u64 h1 = seed ^ len; + + // 将长度除以8(因为u64是8字节) + len >>= 3; + + // 循环处理每个u64数据块 + while (len--) { + // 读取下一个u64数据 + u64 k1 = *data++; + // 应用MurmurHash算法的步骤 + k1 *= 0x87c37b91114253d5ULL; + k1 = ROL64(k1, 31); + k1 *= 0x4cf5ad432745937fULL; + + // 将k1合并到h1 + h1 ^= k1; + h1 = ROL64(h1, 27); + h1 = h1 * 5 + 0x52dce729; + } + + // 最后的哈希值处理步骤 + h1 ^= h1 >> 33; + h1 *= 0xff51afd7ed558ccdULL; + h1 ^= h1 >> 33; + h1 *= 0xc4ceb9fe1a85ec53ULL; + h1 ^= h1 >> 33; + + // 返回最终的哈希值 + return h1; } +// 如果编译目标不是x86_64架构,则定义32位循环左移宏ROL32 #else - #define ROL32(_x, _r) ((((u32)(_x)) << (_r)) | (((u32)(_x)) >> (32 - (_r)))) +// 定义一个内联函数hash32,用于计算32位哈希值(非x86_64架构专用) static inline u32 hash32(const void* key, u32 len, u32 seed) { - - const u32* data = (u32*)key; - u32 h1 = seed ^ len; - - len >>= 2; - - while (len--) { - - u32 k1 = *data++; - - k1 *= 0xcc9e2d51; - k1 = ROL32(k1, 15); - k1 *= 0x1b873593; - - h1 ^= k1; - h1 = ROL32(h1, 13); - h1 = h1 * 5 + 0xe6546b64; - - } - - h1 ^= h1 >> 16; - h1 *= 0x85ebca6b; - h1 ^= h1 >> 13; - h1 *= 0xc2b2ae35; - h1 ^= h1 >> 16; - - return h1; - + // 将key转换为u32指针 + const u32* data = (u32*)key; + // 初始化哈希值h1,种子与长度异或 + u32 h1 = seed ^ len; + + // 将长度除以4(因为u32是4字节) + len >>= 2; + + // 循环处理每个u32数据块 + while (len--) { + // 读取下一个u32数据 + u32 k1 = *data++; + // 应用MurmurHash算法的步骤 + k1 *= 0xcc9e2d51; + k1 = ROL32(k1, 15); + k1 *= 0x1b873593; + + // 将k1合并到h1 + h1 ^= k1; + h1 = ROL32(h1, 13); + h1 = h1 * 5 + 0xe6546b64; + } + + // 最后的哈希值处理步骤 + h1 ^= h1 >> 16; + h1 *= 0x85ebca6b; + h1 ^= h1 >> 13; + h1 *= 0xc2b2ae35; + h1 ^= h1 >> 16; + + // 返回最终的哈希值 + return h1; } #endif /* ^__x86_64__ */ +// 结束宏定义_HAVE_HASH_H #endif /* !_HAVE_HASH_H */