From 6a4fb872f7b4260fa9d6db40b1bfb500c60c9925 Mon Sep 17 00:00:00 2001 From: aixiao Date: Thu, 24 Apr 2025 10:01:18 +0800 Subject: [PATCH] Add leak_detector_c --- .vscode/settings.json | 3 +- Makefile | 4 +- cache.c | 3 + cap.c | 21 +++- cap.h | 2 +- leak_detector_c/a.out | Bin 0 -> 16968 bytes leak_detector_c/leak_detector_c.c | 197 ++++++++++++++++++++++++++++++ leak_detector_c/leak_detector_c.h | 61 +++++++++ leak_detector_c/leak_info.txt | 12 ++ leak_detector_c/test.c | 20 +++ libcurl.c | 1 + libipset.c | 21 ++++ libipset.h | 1 + 13 files changed, 337 insertions(+), 9 deletions(-) create mode 100644 leak_detector_c/a.out create mode 100644 leak_detector_c/leak_detector_c.c create mode 100644 leak_detector_c/leak_detector_c.h create mode 100644 leak_detector_c/leak_info.txt create mode 100644 leak_detector_c/test.c diff --git a/.vscode/settings.json b/.vscode/settings.json index 310ff0b..d8c6979 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,6 +11,7 @@ "errno.h": "c", "stdlib.h": "c", "string.h": "c", - "stat.h": "c" + "stat.h": "c", + "leak_detector_c.h": "c" } } \ No newline at end of file diff --git a/Makefile b/Makefile index d21455e..f67109f 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ ipquery: cd IP_region_query && CGO_ENABLED=0 go build -ldflags '-w -s' && upx -9 ipquery # 动态链接目标 -$(BIN): cap.o common.o ip2region/ip2region.o ip2region/xdb_searcher.o libipset.o libcurl.o cache.o +$(BIN): cap.o common.o ip2region/ip2region.o ip2region/xdb_searcher.o libipset.o libcurl.o cache.o leak_detector_c/leak_detector_c.o $(CC) $(CFLAGS) -o $(BIN) $^ -lpcap -lipset -lcurl -lcjson # 静态链接目标 @@ -81,4 +81,4 @@ static: cap.o common.o ip2region/ip2region.o ip2region/xdb_searcher.o libipset.o # 清理目标 clean: rm -rf $(BIN) IP_region_query/ipquery - rm -rf cap.o common.o ip2region/ip2region.o ip2region/xdb_searcher.o libipset.o libcurl.o cache.o + rm -rf cap.o common.o ip2region/ip2region.o ip2region/xdb_searcher.o libipset.o libcurl.o cache.o leak_detector_c/leak_detector_c.o diff --git a/cache.c b/cache.c index fc52782..5353de9 100644 --- a/cache.c +++ b/cache.c @@ -88,6 +88,9 @@ void free_ip_cache() cache_size = 0; } + + + char cn_ip[MAXIPSET_][MAXIPLEN] = { 0 }; // 添加一个 IP 到集合(如果已存在则不添加) diff --git a/cap.c b/cap.c index 32c7b90..eb77a99 100644 --- a/cap.c +++ b/cap.c @@ -3,6 +3,7 @@ #include "libipset.h" #include "libcurl.h" #include "cache.h" +#include "leak_detector_c/leak_detector_c.h" pcap_if_t *alldevs, *device; pcap_t *handle; // 会话句柄 @@ -37,7 +38,7 @@ void Processing_IP_addresses(char *src_ip) // 如果ipset规则已经存在,则跳过查询 snprintf(ipset_query_command, sizeof(ipset_query_command), "ipset test %s %s 2>/dev/null", RULE_NAME, src_ip); if (system(ipset_query_command) == 0) { - // _printf(RED "Ipset 规则内已经存在 %s\n" REDEND, src_ip); + _printf(RED "Ipset 规则内已经存在 %s\n" REDEND, src_ip); return; } @@ -92,10 +93,10 @@ void Processing_IP_addresses(char *src_ip) if (parse_json_to_struct(p, &response) == 0) { // 解析 JSON 到结构体 if (NULL == strstr(response.continent_country, "中国")) { // 这时是国外IP - _printf(RED "CurlGetIpArea(): %s %s\n" REDEND, src_ip, response.continent_country); + _printf(RED "CurlGetIpArea(): %s %s\r\n" REDEND, src_ip, response.continent_country); add_ip_to_ipset(RULE_NAME, src_ip); - } else { // 这时是国内IP - if (-1 == add_cn_ip(cn_ip, src_ip)) { // 添加国内IP到缓存 + } else { // 这时是国内IP + if (-1 == add_cn_ip(cn_ip, src_ip)) { // 添加国内IP到缓存 _printf(RED "add_cn_ip() Error!!! 错误:集合已满\n" REDEND); } _printf("IP: %s 离线库为国外, API 判断为国内, 标记为已处理!!!\n", src_ip); @@ -113,11 +114,14 @@ void Processing_IP_addresses(char *src_ip) } } + if (ip2region_area != NULL) { free(ip2region_area); ip2region_area = NULL; } + + dump_mem_leak(); return; } @@ -199,7 +203,10 @@ void cleanup_(int signum) int main(int argc, char **argv) { + atexit(report_mem_leak); + // 注册 SIGTERM 信号处理函数 + signal(SIGINT, cleanup_); signal(SIGTERM, cleanup_); int opt; @@ -337,9 +344,12 @@ int main(int argc, char **argv) if (create_ipset(RULE_NAME) != 0) { _printf("创建 IPSet %s 失败\n", RULE_NAME); } else { + /* char iptables_command[256]; sprintf(iptables_command, "iptables -I INPUT -m set --match-set %s src -j DROP", RULE_NAME); system(iptables_command); + */ + add_iptables_rule(RULE_NAME); } } @@ -349,7 +359,7 @@ int main(int argc, char **argv) } } - sleep(3); // 每 3 秒检查一次 + sleep(7); // 每 3 秒检查一次 } } @@ -406,6 +416,7 @@ int main(int argc, char **argv) pcap_freecode(&fp); pcap_freealldevs(alldevs); // 释放设备列表 pcap_close(handle); // 关闭会话句柄 + return 0; } diff --git a/cap.h b/cap.h index 121155b..44b64c7 100644 --- a/cap.h +++ b/cap.h @@ -24,7 +24,7 @@ #define REDEND "\033[0m" #define MAXIPSET 65535 -#define MAXIPSET_RULT_NAME_NUM 26 +#define MAXIPSET_RULT_NAME_NUM 32 #define _VERSION "0.2" diff --git a/leak_detector_c/a.out b/leak_detector_c/a.out new file mode 100644 index 0000000000000000000000000000000000000000..d75b7cfcb76acd1f5fa7e9f57b148cc32f9645a2 GIT binary patch literal 16968 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 literal 0 HcmV?d00001 diff --git a/leak_detector_c/leak_detector_c.c b/leak_detector_c/leak_detector_c.c new file mode 100644 index 0000000..ee75c06 --- /dev/null +++ b/leak_detector_c/leak_detector_c.c @@ -0,0 +1,197 @@ +#include +#include +#include +#include "leak_detector_c.h" + +// 取消宏定义,使用原始 malloc/calloc/free +#undef malloc +#undef calloc +#undef free + +// 全局链表起始与当前位置指针 +static MEM_LEAK *ptr_start = NULL; +static MEM_LEAK *ptr_next = NULL; + +/* + * 将分配的内存信息添加到链表中 + */ +void add(MEM_INFO alloc_info) +{ + MEM_LEAK *mem_leak_info = NULL; + + // 分配一个新的链表节点 + mem_leak_info = (MEM_LEAK *) malloc(sizeof(MEM_LEAK)); + mem_leak_info->mem_info.address = alloc_info.address; + mem_leak_info->mem_info.size = alloc_info.size; + strcpy(mem_leak_info->mem_info.file_name, alloc_info.file_name); + mem_leak_info->mem_info.line = alloc_info.line; + mem_leak_info->next = NULL; + + // 如果是第一个节点 + if (ptr_start == NULL) { + ptr_start = mem_leak_info; + ptr_next = ptr_start; + } else { + // 添加到链表末尾 + ptr_next->next = mem_leak_info; + ptr_next = ptr_next->next; + } +} + +/* + * 根据位置索引从链表中删除内存记录 + */ +void erase(unsigned pos) +{ + unsigned index = 0; + MEM_LEAK *alloc_info, *temp; + + // 删除第一个节点 + if (pos == 0) { + MEM_LEAK *temp = ptr_start; + ptr_start = ptr_start->next; + free(temp); + } else { + // 删除中间或最后一个节点 + for (index = 0, alloc_info = ptr_start; index < pos; alloc_info = alloc_info->next, ++index) { + if (pos == index + 1) { + temp = alloc_info->next; + alloc_info->next = temp->next; + free(temp); + break; + } + } + } +} + +/* + * 清空链表中所有内存记录 + */ +void clear() +{ + MEM_LEAK *temp = ptr_start; + MEM_LEAK *alloc_info = ptr_start; + + while (alloc_info != NULL) { + alloc_info = alloc_info->next; + free(temp); + temp = alloc_info; + } +} + +/* + * 自定义 malloc 函数:分配内存并记录来源信息 + */ +void *xmalloc(unsigned int size, const char *file, unsigned int line) +{ + void *ptr = malloc(size); + if (ptr != NULL) { + add_mem_info(ptr, size, file, line); + } + return ptr; +} + +/* + * 自定义 calloc 函数:分配并初始化内存,同时记录信息 + */ +void *xcalloc(unsigned int elements, unsigned int size, const char *file, unsigned int line) +{ + unsigned total_size; + void *ptr = calloc(elements, size); + if (ptr != NULL) { + total_size = elements * size; + add_mem_info(ptr, total_size, file, line); + } + return ptr; +} + +/* + * 自定义 free 函数:释放内存前先移除记录 + */ +void xfree(void *mem_ref) +{ + remove_mem_info(mem_ref); // 移除记录 + free(mem_ref); // 实际释放 +} + +/* + * 创建内存分配信息并添加到链表中 + */ +void add_mem_info(void *mem_ref, unsigned int size, const char *file, unsigned int line) +{ + MEM_INFO mem_alloc_info; + + // 清空结构体,确保初始化干净 + memset(&mem_alloc_info, 0, sizeof(mem_alloc_info)); + mem_alloc_info.address = mem_ref; + mem_alloc_info.size = size; + strncpy(mem_alloc_info.file_name, file, FILE_NAME_LENGTH); + mem_alloc_info.line = line; + + // 添加到链表中 + add(mem_alloc_info); +} + +/* + * 从链表中移除某段已释放的内存记录 + */ +void remove_mem_info(void *mem_ref) +{ + unsigned short index; + MEM_LEAK *leak_info = ptr_start; + + // 遍历链表查找目标地址 + for (index = 0; leak_info != NULL; ++index, leak_info = leak_info->next) { + if (leak_info->mem_info.address == mem_ref) { + erase(index); // 找到后删除 + break; + } + } +} + +/* + * 将所有未释放的内存信息写入输出文件 + */ +void report_mem_leak(void) +{ + MEM_LEAK *leak_info; + FILE *fp_write = fopen(OUTPUT_FILE, "wt"); + + if (fp_write != NULL) { + fprintf(fp_write, "Memory Leak Summary\n"); + fprintf(fp_write, "-----------------------------------\n"); + + // 遍历所有未释放的记录,写入文件 + for (leak_info = ptr_start; leak_info != NULL; leak_info = leak_info->next) { + fprintf(fp_write, "address : %p\n", leak_info->mem_info.address); + fprintf(fp_write, "size : %d bytes\n", leak_info->mem_info.size); + fprintf(fp_write, "file : %s\n", leak_info->mem_info.file_name); + fprintf(fp_write, "line : %d\n", leak_info->mem_info.line); + fprintf(fp_write, "-----------------------------------\n"); + } + + fclose(fp_write); // 关闭输出文件 + } + + clear(); // 清空链表,释放资源 +} + + +void dump_mem_leak(void) +{ + MEM_LEAK *leak_info; + leak_info = ptr_start; + + if (leak_info != NULL) { + fprintf(stderr, "Memory Leak Snapshot\n"); + fprintf(stderr, "-----------------------------------\n"); + + for (; leak_info != NULL; leak_info = leak_info->next) { + fprintf(stderr, "address : %p\n", leak_info->mem_info.address); + fprintf(stderr, "size : %d bytes\n", leak_info->mem_info.size); + fprintf(stderr, "file : %s\n", leak_info->mem_info.file_name); + fprintf(stderr, "line : %d\n", leak_info->mem_info.line); + fprintf(stderr, "-----------------------------------\n"); + } + } +} diff --git a/leak_detector_c/leak_detector_c.h b/leak_detector_c/leak_detector_c.h new file mode 100644 index 0000000..6ad3d65 --- /dev/null +++ b/leak_detector_c/leak_detector_c.h @@ -0,0 +1,61 @@ +#ifndef LEAK_DETECTOR_C_H +#define LEAK_DETECTOR_C_H + +// 文件名最大长度 +#define FILE_NAME_LENGTH 256 + +// 内存泄漏信息输出文件 +#define OUTPUT_FILE "leak_info.txt" + +// 用宏重定义 malloc、calloc 和 free,为其添加文件名和行号信息 +#define malloc(size) xmalloc (size, __FILE__, __LINE__) +#define calloc(elements, size) xcalloc (elements, size, __FILE__, __LINE__) +#define free(mem_ref) xfree(mem_ref) + +// 用于记录每一次内存分配的信息结构体 +struct _MEM_INFO { + void *address; // 分配的内存地址 + unsigned int size; // 分配的大小 + char file_name[FILE_NAME_LENGTH]; // 分配发生的文件名 + unsigned int line; // 分配发生的代码行号 +}; +typedef struct _MEM_INFO MEM_INFO; + +// 内存泄漏记录结构体,使用链表形式组织 +struct _MEM_LEAK { + MEM_INFO mem_info; // 内存信息 + struct _MEM_LEAK *next; // 指向下一个节点的指针 +}; + +typedef struct _MEM_LEAK MEM_LEAK; + +// 添加一条内存分配信息记录 +void add(MEM_INFO alloc_info); + +// 删除某个位置的内存记录 +void erase(unsigned pos); + +// 清空所有内存记录 +void clear(void); + +// 自定义 malloc:记录内存分配位置 +void *xmalloc(unsigned int size, const char *file, unsigned int line); + +// 自定义 calloc:记录内存分配位置 +void *xcalloc(unsigned int elements, unsigned int size, const char *file, unsigned int line); + +// 自定义 free:在释放内存时移除记录 +void xfree(void *mem_ref); + +// 添加一条内存分配记录 +void add_mem_info(void *mem_ref, unsigned int size, const char *file, unsigned int line); + +// 移除某个内存记录(在调用 free 时使用) +void remove_mem_info(void *mem_ref); + +// 生成内存泄漏报告 +extern void report_mem_leak(void); + +extern void dump_mem_leak(void); + +#endif diff --git a/leak_detector_c/leak_info.txt b/leak_detector_c/leak_info.txt new file mode 100644 index 0000000..2196468 --- /dev/null +++ b/leak_detector_c/leak_info.txt @@ -0,0 +1,12 @@ +Memory Leak Summary +----------------------------------- +address : 0x7fffe6d502a0 +size : 1 bytes +file : test.c +line : 8 +----------------------------------- +address : 0x7fffe6d50520 +size : 60 bytes +file : test.c +line : 14 +----------------------------------- diff --git a/leak_detector_c/test.c b/leak_detector_c/test.c new file mode 100644 index 0000000..007d893 --- /dev/null +++ b/leak_detector_c/test.c @@ -0,0 +1,20 @@ +#include +#include +#include "leak_detector_c.h" +int main() +{ + atexit(report_mem_leak); + + char *ptr1 = (char *)malloc(1); + + + + + int *ptr2 = (int *)calloc(1, sizeof(int)); + float * ptr3 = (float *) calloc(15, sizeof(float)); + free(ptr2); + + dump_mem_leak(); + + return 0; +} diff --git a/libcurl.c b/libcurl.c index dc4bcfe..a559a0e 100644 --- a/libcurl.c +++ b/libcurl.c @@ -192,6 +192,7 @@ int parse_json_to_struct(const char *json_string, Response *response) cJSON *root = cJSON_Parse(json_string); if (!root) { fprintf(stderr, "Error parsing JSON: %s\n", cJSON_GetErrorPtr()); + printf("%s\n", json_string); return -1; } // 解析字段 diff --git a/libipset.c b/libipset.c index ed3895a..35d24bd 100644 --- a/libipset.c +++ b/libipset.c @@ -208,6 +208,27 @@ int get_ip_count_in_ipset(char *set_name) return ip_count; } + +void add_iptables_rule(const char *rule_name) +{ + char iptables_command[256]; + + // 使用 snprintf 避免溢出 + int written = snprintf(iptables_command, sizeof(iptables_command), + "iptables -I INPUT -m set --match-set %s src -j DROP", rule_name); + + if (written < 0 || written >= sizeof(iptables_command)) { + fprintf(stderr, "Error: iptables command is too long.\n"); + return; + } + + // 执行命令并检查返回值 + int ret = system(iptables_command); + if (ret != 0) { + fprintf(stderr, "Failed to execute iptables command: %s\n", iptables_command); + } +} + /* int main() { diff --git a/libipset.h b/libipset.h index c55cec5..172ab9c 100644 --- a/libipset.h +++ b/libipset.h @@ -13,5 +13,6 @@ extern int create_ipset(char *set_name); extern int add_ip_to_ipset(char *set_name, char *ip); extern int get_ip_count_in_ipset(char *set_name); +extern void add_iptables_rule(const char *rule_name); #endif