(GCC) gcc 编译选项 -fno-omit-frame-pointer,-fno-tree-vectorize,fno-optimize-sibling-calls;及内存泄漏、非法访问检测 ASAN

发布时间 2023-07-19 18:33:01作者: DoubleLi

omit-frame-pointer

开启该选项,主要是用于去掉所有函数SFP(Stack Frame Pointer)的,即在函数调用时不保存栈帧指针SFP,代价是不能通过backtrace进行调试根据堆栈信息了。通过去掉SFP,可以提高程序运行速度,达到优化程序的目的。如果要打开栈指针,使用 -fno-omit-frame-pointer 。

另外一个类似选项-fomit-leaf-frame-pointer :用于去掉子函数leaf function的SFP。该选项属于优化选项,在指定-O选项时,也会开启该选项。

fno-tree-vectorize

gcc -O3级优化已包括 “-ftree-vectorize” 选项对程序进行自动向量化,关闭向量化的选项是-fno-tree-vectorize。使用-ftree-vectorizer-verbose=n选项可以显示自动向量化的结果,其中n的取值范围为0到9。自动矢量化技术简单讲就是一次处理多个数据SIMD,比如x86 sse/mmx,arm neon技术。

fno-optimize-sibling-calls

有些情况下,比如尾部调用子函数,call会被优化成jump指令。使用该选项恢复子函数调用栈。

内存泄漏检测

set(CMAKE_CXX_FLAGS "-fsanitize=undefined,address,leak -fno-omit-frame-pointer -fno-optimize-sibling-calls -ggdb")
set(CMAKE_C_FLAGS "-fsanitize=undefined,address,leak -fno-omit-frame-pointer -fno-optimize-sibling-calls -ggdb")
set(CMAKE_L_FLAGS "-fsanitize=undefined,address,leak -fno-omit-frame-pointer -fno-optimize-sibling-calls -ggdb")

使用Address Sanitizer时,在运行时可以使用ASAN的选项。如下打印出ASAN帮助信息:

ASAN_OPTIONS=help=1 ./test_asan

有用的ASAN选项配置,其中halt_on_error=0跟-fsanitize-recover=address需要同时加上:

# compile flag
-fsanitize-recover=address

# run-time option
ASAN_OPTIONS=halt_on_error=0:alloc_dealloc_mismatch=0

参考