簡體   English   中英

使用asan和strsep()未檢測到泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM