gpt4 book ai didi

c - 使用 asan 和 strsep() 未检测到的泄漏

转载 作者:行者123 更新时间:2023-11-30 14:42:52 25 4
gpt4 key购买 nike

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 检测到吗?

最佳答案

LeakSanitizer 设计时使用简单的算法进行泄漏检测。每当对已分配 block 的引用恰好位于堆栈、寄存器或事件堆 block 上的某个位置时,LSan 就会认为它是“可访问的”,因此不会报告泄漏。这使得它对编译器版本、优化选项(即变量是否溢出到堆栈)等非常敏感。我强烈怀疑您遇到了此限制。

关于c - 使用 asan 和 strsep() 未检测到的泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54285757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com