[英]Undetected leak with asan and strsep()
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使用非常原始的算法進行泄漏檢測。 每當對分配的塊的引用恰好位於堆棧,寄存器或活動堆塊中的某個位置時,LSan都會認為它是“可到達的”,因此不會報告泄漏。 這使得它對編譯器版本,優化選項(即變量是否溢出到堆棧)等非常敏感。我強烈懷疑您遇到此限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.