c技巧与知识点
包括但不限于语法、编译、测试、内存检查、链接等。
Address Sanitizer
AddressSanitizer (ASan)是一个性能非常好的 C/C++ 内存错误探测工具。它由编译器的插桩模块(目前,LLVM 通过)和替换了 malloc 函数的运行时库组成。这个工具可以探测如下这些类型的错误:
- 对堆,栈和全局内存的访问越界(堆缓冲区溢出,栈缓冲区溢出,和全局缓冲区溢出)
- UAP(Use-after-free,悬挂指针的解引用,或者说野指针)
- Use-after-return(无效的栈上内存,运行时标记
- ASAN_OPTIONS=detect_stack_use_after_return=1)
- Use-After-Scope(作用域外访问,clang 标记 -fsanitize- address-use-after-scope )
- 内存的重复释放
- 初始化顺序的 bug
- 内存泄漏
这个工具非常快。通常情况下,内存问题探测这类调试工具的引入,会导致原有应用程序运行性能的大幅下降,比如大名鼎鼎的 valgrind 据说会导致应用程序性能下降到正常情况的十几分之一,但引入 AddressSanitizer 只会减慢运行速度的一半。
使用 AddressSanitizer 可以在程序发生内存问题的时候及时检查出来,精准定位发生内存问题的位置,大大提高我们debug的效率。
以上来源于LINUX 下使用Address Sanitizer ,以及不能运行的问题, 该工具可用于c调试使用,在编译链接的时候添加-fsanitize=address参数进行使用,但是在配合vscode或者ide调试的时候,会报错Address Sanitizer无法运行,因为程序本身已经运行了占用了Address Sanitizer通道。一般忽略即可。