更改printf后,AddressSanitizer找不到明显的泄漏

我想弄清楚为什么ASAN不能解决简单的内存泄漏问题。 valgrind觉得很好。帮助吗?

ASAN 找到的示例。

#include <stdlib.h>
#include <stdio.h>

void blah(void)
{
        int *some_int = malloc(sizeof(int));
        *some_int = 1;
        printf("hello %p\n",some_int);
        // some_int is lost here
}

int main()
{
        blah();
        return 0;
}

mbryan@remotedev-mbryan:~/git/mbryan/onefs$ clang -fsanitize=address -O0 q.c
mbryan@remotedev-mbryan:~/git/mbryan/onefs$ ./a.out
hello 0x602000000010

=================================================================
==10751==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x4d9bd0 in malloc (/ifs/home/mbryan/git/mbryan/onefs/a.out+0x4d9bd0)
    #1 0x5120f3 in blah (/ifs/home/mbryan/git/mbryan/onefs/a.out+0x5120f3)
    #2 0x512183 in main (/ifs/home/mbryan/git/mbryan/onefs/a.out+0x512183)
    #3 0x7f3515000b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310

SUMMARY: AddressSanitizer: 4 byte(s) leaked in 1 allocation(s).

到目前为止,一切都很好。现在打印值而不是指针:

#include <stdlib.h>
#include <stdio.h>

void blah(void)
{
        int *some_int = malloc(sizeof(int));
        *some_int = 1;
        printf("hello %d\n",*some_int);  // <---------------
}

int main()
{
        blah();
        return 0;
}

mbryan@remotedev-mbryan:~/git/mbryan/onefs$ clang -fsanitize=address -O0 q.c
mbryan@remotedev-mbryan:~/git/mbryan/onefs$ ./a.out
hello 1

...现在没有泄漏。

关于后者,如果我在没有消毒剂的情况下重新编译并运行valgrind,则valgrind确实显示泄漏: == 10782 ==绝对丢失:1块中有4个字节

看一下程序集:我看到优化器没有使我的malloc变量成为局部变量或其他欺骗手段。那么:为什么AddressSanitizer不接这个呢?我缺少明显的东西吗?

这是在Ubuntu18.04上使用clang 6.0.0-1ubuntu2。

dalanmao007 回答:更改printf后,AddressSanitizer找不到明显的泄漏

ASAN的人员告诉我,这是一个已知的错误: https://github.com/google/sanitizers/issues/937

LeakSanitizer:当函数堆栈框架覆盖#937时为false否定

本文链接:https://www.f2er.com/3155503.html

大家都在问