2017-01-09 89 views
0

我正在将库连接到opencv库。我注意到当我为该库运行单元测试可执行文件(使用GTest)时,该valgrind报告内存泄漏/条件跳转或移动取决于未初始化的值,即使测试完全没有做任何事情(只是空的测试方法)。连接opencv时内存泄漏

我将这个问题追溯到我的CMakeLists.txt中的单行 - 当我删除与opencv的链接时,内存泄漏消失。这是releavant片段:

find_package(OpenCV REQUIRED) 

set(libImageSources src/SourceImageFile.cpp) 

add_library(image SHARED ${libImageSources}) 

# removing this line fixes the leak: 
target_link_libraries(image ${OpenCV_LIBS}) 

否则运行过程中出现一个空的单元测试时,我得到这样一个错误:

==18681== Memcheck, a memory error detector 
==18681== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==18681== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info 
==18681== Command: ./image_test /Users/max/Documents/playground/cpp/image-server/tests 
==18681== 
==18681== Conditional jump or move depends on uninitialised value(s) 
==18681== at 0x7FFF5FC24A27: bcmp (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC11904: ImageLoaderMachO::validateFirstPages(linkedit_data_command const*, int, unsigned char const*, unsigned long, long long, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC16B7A: ImageLoaderMachOCompressed::instantiateFromFile(char const*, int, unsigned char const*, unsigned long, unsigned long long, unsigned long long, stat const&, unsigned int, unsigned int, linkedit_data_command const*, encryption_info_command const*, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC10A6E: ImageLoaderMachO::instantiateFromFile(char const*, int, unsigned char const*, unsigned long long, unsigned long long, stat const&, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC038C2: dyld::loadPhase6(int, stat const&, char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08468: dyld::loadPhase5(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08188: dyld::loadPhase4(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07EED: dyld::loadPhase3(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07642: dyld::loadPhase1(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0347A: dyld::loadPhase0(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0315E: dyld::load(char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08705: dyld::libraryLocator(char const*, bool, char const*, ImageLoader::RPathChain const*) (in /usr/lib/dyld) 
==18681== 
==18681== Use of uninitialised value of size 8 
==18681== at 0x7FFF5FC24A3F: bcmp (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC11904: ImageLoaderMachO::validateFirstPages(linkedit_data_command const*, int, unsigned char const*, unsigned long, long long, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC16B7A: ImageLoaderMachOCompressed::instantiateFromFile(char const*, int, unsigned char const*, unsigned long, unsigned long long, unsigned long long, stat const&, unsigned int, unsigned int, linkedit_data_command const*, encryption_info_command const*, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC10A6E: ImageLoaderMachO::instantiateFromFile(char const*, int, unsigned char const*, unsigned long long, unsigned long long, stat const&, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC038C2: dyld::loadPhase6(int, stat const&, char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08468: dyld::loadPhase5(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08188: dyld::loadPhase4(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07EED: dyld::loadPhase3(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07642: dyld::loadPhase1(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0347A: dyld::loadPhase0(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0315E: dyld::load(char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08705: dyld::libraryLocator(char const*, bool, char const*, ImageLoader::RPathChain const*) (in /usr/lib/dyld) 
==18681== 
==18681== Use of uninitialised value of size 8 
==18681== at 0x7FFF5FC24A44: bcmp (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC11904: ImageLoaderMachO::validateFirstPages(linkedit_data_command const*, int, unsigned char const*, unsigned long, long long, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC16B7A: ImageLoaderMachOCompressed::instantiateFromFile(char const*, int, unsigned char const*, unsigned long, unsigned long long, unsigned long long, stat const&, unsigned int, unsigned int, linkedit_data_command const*, encryption_info_command const*, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC10A6E: ImageLoaderMachO::instantiateFromFile(char const*, int, unsigned char const*, unsigned long long, unsigned long long, stat const&, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC038C2: dyld::loadPhase6(int, stat const&, char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08468: dyld::loadPhase5(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08188: dyld::loadPhase4(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07EED: dyld::loadPhase3(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07642: dyld::loadPhase1(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0347A: dyld::loadPhase0(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0315E: dyld::load(char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08705: dyld::libraryLocator(char const*, bool, char const*, ImageLoader::RPathChain const*) (in /usr/lib/dyld) 
==18681== 
==18681== Conditional jump or move depends on uninitialised value(s) 
==18681== at 0x7FFF5FC11907: ImageLoaderMachO::validateFirstPages(linkedit_data_command const*, int, unsigned char const*, unsigned long, long long, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC16B7A: ImageLoaderMachOCompressed::instantiateFromFile(char const*, int, unsigned char const*, unsigned long, unsigned long long, unsigned long long, stat const&, unsigned int, unsigned int, linkedit_data_command const*, encryption_info_command const*, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC10A6E: ImageLoaderMachO::instantiateFromFile(char const*, int, unsigned char const*, unsigned long long, unsigned long long, stat const&, ImageLoader::LinkContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC038C2: dyld::loadPhase6(int, stat const&, char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08468: dyld::loadPhase5(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08188: dyld::loadPhase4(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07EED: dyld::loadPhase3(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC07642: dyld::loadPhase1(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0347A: dyld::loadPhase0(char const*, char const*, dyld::LoadContext const&, std::__1::vector<char const*, std::__1::allocator<char const*> >*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0315E: dyld::load(char const*, dyld::LoadContext const&) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC08705: dyld::libraryLocator(char const*, bool, char const*, ImageLoader::RPathChain const*) (in /usr/lib/dyld) 
==18681== by 0x7FFF5FC0E85D: ImageLoader::recursiveLoadLibraries(ImageLoader::LinkContext const&, bool, ImageLoader::RPathChain const&) (in /usr/lib/dyld) 
==18681== 
[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from ImageProcessingConfigurationService 
[ RUN  ] ImageProcessingConfigurationService.evaluateConfigurationFile 
[  OK ] ImageProcessingConfigurationService.evaluateConfigurationFile (13 ms) 
[----------] 1 test from ImageProcessingConfigurationService (28 ms total) 

[----------] Global test environment tear-down 
[==========] 1 test from 1 test case ran. (114 ms total) 
[ PASSED ] 1 test. 
==18681== 
==18681== HEAP SUMMARY: 
==18681==  in use at exit: 1,346,030 bytes in 1,453 blocks 
==18681== total heap usage: 2,926 allocs, 1,473 frees, 3,045,052 bytes allocated 
==18681== 
==18681== LEAK SUMMARY: 
==18681== definitely lost: 10,580 bytes in 137 blocks 
==18681== indirectly lost: 10,032 bytes in 152 blocks 
==18681==  possibly lost: 9,568 bytes in 183 blocks 
==18681== still reachable: 43,598 bytes in 520 blocks 
==18681==   suppressed: 1,272,252 bytes in 461 blocks 
==18681== Rerun with --leak-check=full to see details of leaked memory 
==18681== 
==18681== For counts of detected and suppressed errors, rerun with: -v 
==18681== Use --track-origins=yes to see where uninitialised values come from 
==18681== ERROR SUMMARY: 36 errors from 4 contexts (suppressed: 0 from 0) 

编译器是铛++苹果LLVM版本7.3.0(铛-703.0.31 ),OS X El Capitan(10.11.1)。

其他人有这样的问题?看起来东西起作用是毫无意义的,但是错误产生了我宁愿忽略的噪音,我不知道我是否能够解决根本原因。

+0

'... valgrind报告内存泄漏/无效free' - 在错误日志中,我看到只有内存泄漏加上'条件跳转或移动取决于未初始化的值'在动态加载程序中。没有“无效免费”左右。 – Tsyvarev

+0

@Tsyvarev这是真的,我的意思是'跳到单位价值'消息,抱歉。我认为这很可能是Valgrind的误判,我使用OS X分析器检查内存泄漏,看起来很好。 – Max

+0

@ usr1234567我认为这与CMake无关,因为我调试它,但感谢您的指针。 – Max

回答

0

这个问题似乎是valgrind报告的误报,我可以忽略它,因为它不是由代码引起的。

我试过了(写这篇文章的时候)最新的valgrind suppressions file for macOS这对我不起作用,这个问题还在报道中。

我让valgrind dump the suppressions需要忽略这个错误,使用如下命令:

valgrind --leak-check=full --show-reachable=yes --error-limit=no --gen-suppressions=all --log-file=l.log ./image_test 

,然后用来a tool to parse the log output(awk的脚本并没有为我,因为它包含了一个语法错误的工作,我用perl的版本)转换为镇压文件:

cat l.log | ./parse_valgrind_suppressions.pl > s.supp 

现在运行与所生成文件suppresions测试忽略内存泄漏:

valgrind --suppressions=./s.supp ./image_test