Tag: sanitizer

如何在编译时启用Leak Sanitizer?

GCC和Clang编译器都支持LeakSanitizer ,它有助于在C程序中查找内存泄漏。 有时内存泄漏是不可避免的(因为它正在测试套件中进行测试)。 可以使用Leak Sanitizer界面注释这样的内存: #include void *p = create_new_object(); __lsan_ignore_object(p); 然而,这将在不支持LSan的编译器上中断。 在Address Sanitizer中,此构造可用于检测ASAN的可用性: /* __has_feature(address_sanitizer) is used later for Clang, this is for * compatibility with other compilers (such as GCC and MSVC) */ #ifndef __has_feature # define __has_feature(x) 0 #endif #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) /* ASAN-aware code here. */ #endif 没有__has_feature(leak_sanitizer)来检测Clang中__SANITIZE_LEAKS__存在__SANITIZE_LEAKS__ ,GCC也不存在__SANITIZE_LEAKS__ 。 […]

如何在gdb中打破UBSan报告并继续?

最新版本的GCC和Clang具有Undefined Behavior Sanitizer(UBSan),它是一个编译标志( -fsanitize=undefined ),用于添加运行时检测代码。 出现错误时,会显示如下警告: packet-ber.c:1917:23:运行时错误:左移54645397829836991 8个位置无法在类型’long int’中表示 现在我想调试这个并在所述行上获得调试中断。 对于Address Sanitizer(ASAN), ASAN_OPTIONS=abort_on_error=1会导致可捕获的致命错误。 唯一可用的UBSan选项是UBSAN_OPTIONS=print_stacktrace=1 ,这会导致报告的调用跟踪转储。 但是,这不允许我检查局部变量,然后继续该程序。 因此无法使用-fsanitize-undefined-trap-on-error 。 我应该如何在UBSan报告中打破gdb? 虽然break __sanitizer::SharedPrintfCode似乎有效但名称看起来很内部。