【发布时间】:2019-01-21 18:24:54
【问题描述】:
GCC 8.2.0 未检测到使用-fsanitize=address 编译的以下代码中的泄漏:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *str1 = "tok1:val2";
char *str1_dup = strndup(str1, strlen(str1));
char *str1_dup_head = str1_dup;
char *tok1 = strsep(&str1_dup, ":");
// What should be done to avoid the memory leak
//free(str1_dup_head);
return 0;
}
但是,在以下情况下会检测到泄漏:
- 用
-fsanitize=leak编译 - 用
clang -fsanitize=address编译 - 没有保留给
strsep()(str1_dup_cpy) 的指针头部的副本时(参见下面的代码)
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *str1 = "tok1:val2";
char *str1_dup = strndup(str1, strlen(str1));
//char *str1_dup_head = str1_dup;
char *tok1 = strsep(&str1_dup, ":");
// What should be done to avoid the memory leak
//free(str1_dup_head);
return 0;
}
知道为什么会出现这种行为吗?是否应该被-fsanitize=address检测到?
【问题讨论】:
-
strndup为复制的字符分配存储空间。 -
@Barmar 否,因为 strsep() 移动了指针。见这里stackoverflow.com/questions/21000218/…。还有人 strsep。
-
@JeffBencteux 谢谢,没有看到那里正在使用该变量。
标签: c gcc address-sanitizer