关于GCC/LLVM编译器中的sanitize选项用处用法详解

关于GCC/LLVM编译器中的sanitize选项用处用法详解

​ 编译器中sanitize选项原本来自google的开源C/C+ +工具集sanitizers项目, 包括了AddressSanitizer, MemorySanitizer, ThreadSanitizer, LeakSanitizer,Sanitizers项目本是LLVM项目的一部分,但GNU也将该系列工具加入到了自家的GCC编译器中。GCC从4.8版本开始支持Address和Thread Sanitizer,4.9版本开始支持Leak Sanitizer和UB Sanitizer,这些都是查找隐藏Bug的利器。

​ 关于GNU GCC提供的关于sanitize的编译选项有:

  1. -fsanitize=address

    开启AddressSanitizer,一个快速的内存错误检查工具。内存访问的指令用于检测越界和使用后释放的bug。此外可以通过设置ASAN_OPTIONS环境变量来影响运行时的行为。当ASAN_OPTIONS环境变量设置为help=1时(如:ASAN_OPTIONS=help=1),所有可用的选项将在将在程序启用时显示。更多关于ASAN_OPTIONS环境变量有哪些预设值,参考wiki。ASAN_OPTIONS环境变量不能结合-fsanitize=thread使用。

  2. -fsanitize=kernel-address

    为Linux kernel开启AddressSanitizer。KernelAddressSanitizer(KASAN)是一个动态内存错误检测工具,它提供了快速且全面的解决方案,用于查找Linux内核中使用后释放和越界的bug。更多信息查看KASAN wiki。

  3. -fsanitize=pointer-compare

    指针操作数的比较操作工具(<, <=, >, >=)。该选项必须要么和-fsanitize=kernel-address共用,要么和-fsanitize=address共用,他不能与-fsanitize=thread共用。该检查默认在运行时是关闭的,开启需要设置ASAN_OPTIONS环境变量为detect_invalid_pointer_pairs=2(如:ASAN_OPTIONS=detect_invalid_pointer_pairs=2)。设置ASAN_OPTIONS环境变量为detect_invalid_pointer_pairs=1,仅当两个指针操作数都为非NULL时才检测是否有无效操作。

  4. -fsanitize=pointer-subtract

    指针操作数的比较操作工具(-)。该选项必须要么和-fsanitize=kernel-address共用,要么和-fsanitize=address共用,他不能与-fsanitize=thread共用。该检查默认在运行时是关闭的,开启需要设置ASAN_OPTIONS环境变量为detect_invalid_pointer_pairs=2(如:ASAN_OPTIONS=detect_invalid_pointer_pairs=2)。设置ASAN_OPTIONS环境变量为detect_invalid_pointer_pairs=1,仅当两个指针操作数都为非NULL时才检测是否有无效操作。

  5. -fsanitize=thread

    开启ThreadSanitizer,一个快速的数据竞争检测工具。内存访问的指令用作检测数据竞争的bug。更多信息见threadsanitizer wiki。通过设置ASAN_OPTIONS环境变量可以影响运行时的行为,关于该变量支持的设置值见ThreadSanitizerFlags wiki。该选项不能与-fsanitize=address-fsanitize=leak共用。

  6. -fsanitize=leak

    开启LeakSanitizer,一个内存泄露检测工具。该选项仅关心链接或覆盖了malloc和其他分配器的库的可执行程序。更多信息见AddressSanitizerLeakSanitizer wiki。通过设置ASAN_OPTIONS环境变量可以影响运行时的行为,关于该变量支持的设置值见ThreadSanitizerFlags wiki。该选项不能与-fsanitize=thread共用。

    还有几个关于sanitizer的编译选项,有兴趣的参看:https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html

你可能感兴趣的:(compiler,techniques)