首页 > 解决方案 > 抑制由第三方库引起的间接泄漏

问题描述

我有这个非常简单C的代码调用scheme脚本guile

/* main.c */
#include <libguile.h>

int main(void)
{
    scm_init_guile();
    scm_c_primitive_load("script.scm");

    SCM func = scm_variable_ref(scm_c_lookup("func"));

    scm_call_0(func);
    return 0;
}

scheme脚本:

; script.scm
(define (func)
    (display "Hello from scheme\n")
)

编译和运行:

export ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=suppressions=asan.supp
gcc -std=c11 -Wpedantic -Wall `pkg-config --cflags guile-3.0` \
    -fsanitize=address -fno-omit-frame-pointer \
    -o demo main.c `pkg-config --libs guile-3.0`
./demo

我能够抑制guile使用此抑制文件 ( asan.supp) 引起的一些泄漏:

leak:iconv_open
leak:libguile

但是其中一个泄漏没有提供足够的信息,消毒剂输出是:

=================================================================
==33333==ERROR: LeakSanitizer: detected memory leaks

Indirect leak of 208 byte(s) in 1 object(s) allocated from:
    #0 0x7ff8a9b8d517 in malloc (/lib/x86_64-linux-gnu/libasan.so.6+0xb0517)
    #1 0x7ff8a97e94f6  (/lib/x86_64-linux-gnu/libc.so.6+0x344f6)

-----------------------------------------------------
Suppressions used:
  count      bytes template
      2      32752 iconv_open
      1         32 libguile
-----------------------------------------------------

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

如您所见,有关泄漏的信息非常通用(malloclibc),当然我不能放入libc抑制文件,因为我不会获得有关我的真实泄漏的信息。

有没有办法抑制第三方库引起的所有“间接泄漏”?

标签: cgccmemory-leaksaddress-sanitizerguile

解决方案


假设您已经使用了-您确实使用了-我相信在某些情况下-fno-omit-frame-pointer您需要添加fast_unwind_on_malloc=0到您的ASAN_OPTIONS(or ) 中。LSAN_OPTIONS这会更慢,但会提供更完整的回溯。

对于 C++ new/ FAQ还建议切换到delete,这可能会更快。不过,这似乎与您无关。-shared-libstdc++


推荐阅读