参考
https://www.qt.io/blog/2013/04/17/using-gccs-4-8-0-address-sanitizer-with-qt
https://doc.qt.io/qt-6/qmake-variable-reference.html#qmake-lflags
AddressSanitizer是gcc编译器套件的一部分(gcc版本 > 4.8),只要在编译器调用中添加-fsanitize=address -fno-omit-frame-pointer,在链接器调用中添加-fsanitize=address就可以使用它。
qmake QMAKE_CXXFLAGS+="-fsanitize=address -fno-omit-frame-pointer" \
QMAKE_CFLAGS+="-fsanitize=address -fno-omit-frame-pointer" \
QMAKE_LFLAGS+="-fsanitize=address" \
CONFIG+=debug \ //debug 模式显示的log可读性更强
xx.pro
执行编译后的可执行程序,待程序正常退出后(Ctrl+c退出不行),会显示log 类似下面的log,指出具体哪个文件哪一行new的内存没释放。(下图中我是编译的release版本,没显示行号,如果编译成debug版本就会详细显示行号)
如果程序中有访问越界之类的严重错误,程序会直接退出,并在log中说明overflow地址,以及文件位置。