linux gcc -如何使用地址清理程序

bihw5rsg  于 2023-01-16  发布在  Linux
关注(0)|答案(2)|浏览(172)

我在linux上使用gcc 4.8.5。我想使用地址杀毒软件,但它不返回任何有关程序的信息。标志:

SET(CMAKE_CXX_FLAGS "-Wall -Wno-error -g -std=c++11 -fno-omit-frame-pointer -fsanitize=address")
SET(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address")

链接库:

target_link_libraries(testcpp asan)

内存泄漏的测试程序:

int main()
{
    int *prt = new int;
    return 0;
}

怎么了?

cbeh67ev

cbeh67ev1#

我用GCC 7在最近的Debian/Sid/x86-64上编译了这个

// file irbis.cc
int main()
{
  int *prt = new int;
  return 0;
}

使用

g++ -fsanitize=address -g3 -std=c++11 irbis.cc -o irbis

并且在执行./irbis时正确地检测到泄漏:

=================================================================
==22742==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x7f77ea911340 in operator new(unsigned long) 
            (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdb340)
    #1 0x55ea91cca81b in main /home/basile/tmp/irbis.cc:4
    #2 0x7f77e9c1f2e0 in __libc_start_main 
            (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)

SUMMARY: AddressSanitizer: 4 byte(s) leaked in 1 allocation(s).

所以升级你的GCC编译器(至少升级到GCC 6)。我知道GCC4.8对地址消毒器和C++11的支持不完整(顺便说一句,GCC4.8已经过时了,GCC 5也是如此,在2017年11月)。

r7knjye2

r7knjye22#

问题的原因可能是main没有使用ptr,所以它可能被完全优化了。

// file irbis.cc
int main()
{
  int *prt = new int;
  return *ptr;
}

相关问题