2017-01-09 6 views
0

Я связываю библиотеку с библиотеками opencv. Я заметил, что когда я запускаю исполняемый файл unit test (используя 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) 

компилятор лязг ++ компании Apple LLVM версии 7.3.0 (лязг-703.0.31), OS X El Capitan (10.11.1).

У кого-нибудь еще была проблема? Кажется, что материал работает не так, но ошибка создает шум, который я бы предпочел игнорировать, я не уверен, могу ли я исправить первопричину.

+0

'... что valgrind сообщает об утечке памяти/недействителен бесплатно. - В журнале ошибок я вижу только утечку памяти плюс« Условный переход или перемещение зависит от неинициализированного значения »в динамическом загрузчике. Нет «инвалид бесплатно» или около того. – Tsyvarev

+0

@ Цыварев, это правда, я имел в виду сообщение «прыгать на унифицированное значение», извините. Я думаю, что это, скорее всего, ложный позитив от 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 
Смежные вопросы