gcc AddressSanitizer

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc AddressSanitizer相关的知识,希望对你有一定的参考价值。

参考技术A 程序中发生内存相关的问题,向来都是让人头大的。这里介绍一下ASan相关的内容,希望可以对debug内存相关的问题有所帮助。

ASan相关的简介可以参考wiki: https://en.wikipedia.org/wiki/AddressSanitizer

ASan在clang(3.1之后)和gcc(4.8之后)均支持,以下以gcc举例:

编译好后,运行

运行程序,会把越界访问地方的call stack打印出来。

gcc -fsanitize选项真的非常强大,heap区动态申请的内存、全局data段的内存,均可以被侦测到。另外-fsanitize选项较多,具体可以参考gcc的手册:
https://gcc.gnu.org/onlinedocs/
强烈建议备一份。这些选项包括内存泄漏的检测,多线程临界资源监测等等。

Address Sanitizer - 我可以在 N 个缺陷后停止吗?

【中文标题】Address Sanitizer - 我可以在 N 个缺陷后停止吗?【英文标题】:Address Sanitizer - can I stop after N defects? 【发布时间】:2019-02-21 16:44:01 【问题描述】:

我意识到某些 Address Sanitizer 功能可能因 GCC 和 clang 而异;我的兴趣主要是 GCC(目前使用 GCC 6.2 和 7.3)

我可以使用ASAN_OPTIONS 设置halt_on_error=0 在报告缺陷后继续运行,或者将其设置为 1 以在报告第一个缺陷后立即停止。

我正在寻找的是一种在 N 个缺陷后停止的方法。 halt_on_error=N 不起作用,因为它只是一个二进制设置(开/关)。

有没有其他方法可以做到这一点:

当简单地在命令行运行 exe 时,通过一些环境设置? 在调试器内部时 - 例如类似b some_asan_defect_reporting_function if (asan_defect_count == N)

提前感谢您提供上述任何信息。

戈登

【问题讨论】:

顺便说一句,我意识到我可以通过添加 __asan_on_error() 的实现来实现这一点,该实现计算它被调用的次数等;不过在这样做之前,我只是想检查一下该功能是否已经在消毒剂的某个地方实现了。 halt_on_error=N - 我的印象是 N 这里的意思是 unique 错误的数量。 不幸的是:setenv ASAN_OPTIONS "halt_on_error=2" ; a.out 错误:bool 选项的值无效:'2' 错误:标志解析失败。 【参考方案1】:

曾经有一个补充 ASAN_OPTIONS=max_errors=N 标志 halt_on_error 但它在代码审查期间提出了太多问题并且没有令人信服的用例所以我中途放弃了它(你可以看到它被丢弃在this stage)。如果您觉得它可能有用,请尝试在 Sanitizers tracker 中提交错误。

【讨论】:

以上是关于gcc AddressSanitizer的主要内容,如果未能解决你的问题,请参考以下文章

Mac OSX 上的 GCC——多个版本的 gcc

mingw和gcc的关系?mingw具有gcc的全部核心编译功能吗

gcc 和 g++/gcc-c++ 有啥区别?

ubuntu系统下怎么安装gcc编译器

GCC:在 GCC 版本之间伪装

arm gcc 内嵌汇编,gcc该是啥选项呢