Недопустимо free (): boost :: filesystem :: path :: ~ path () - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю над программой на CentOS 7.5.1804 с использованием компилятора g ++ 6.3.0

Когда я запускаю программу, она возвращает ошибку:

-bash-4.2$ ./lost_drv 
*** Error in `./lost_drv': free(): invalid pointer: 0x0000000002375cf8 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x81499)[0x7f5c65e85499]
./lost_drv(_ZN5boost10filesystem4pathD2Ev+0x18)[0x521564]
/lib64/libc.so.6(__cxa_finalize+0x9a)[0x7f5c65e3df4a]
/lib64/libboost_filesystem.so.1.53.0(+0x7573)[0x7f5c68317573]
======= Memory map: ========

Valgrindпоказывает, что это проблема с деструктором boost :: filesystem :: path

-bash-4.2$ valgrind ./lost_drv 
==32523== Memcheck, a memory error detector
==32523== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==32523== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==32523== Command: ./lost_drv
==32523== 
==32523== Invalid free() / delete / delete[] / realloc()
==32523==    at 0x4C2B1CD: operator delete(void*) (vg_replace_malloc.c:576)
==32523==    by 0x521563: boost::filesystem::path::~path() (path.hpp:55)
==32523==    by 0x73DBF49: __cxa_finalize (in /usr/lib64/libc-2.17.so)
==32523==    by 0x5053572: ??? (in /usr/lib64/libboost_filesystem.so.1.53.0)
==32523==    by 0x40101C9: _dl_fini (in /usr/lib64/ld-2.17.so)
==32523==    by 0x73DBBD8: __run_exit_handlers (in /usr/lib64/libc-2.17.so)
==32523==    by 0x73DBC26: exit (in /usr/lib64/libc-2.17.so)
==32523==    by 0x73C444B: (below main) (in /usr/lib64/libc-2.17.so)

Ошибка возникает после последнего оператора возврата, так как все очищается.Программа, по-видимому, до этого работала нормально.

Это обширная программа, но я немного упростил ее, добавив оператор возврата сразу после основного:

int main(int argc, char *argv[])
{
 return 0;
...

Iя использую boost :: filesystem для проверки целостности пути ... код, подобный следующему:

try
    {
     boost::filesystem::path fn(ifilenm);
     if(!boost::filesystem::exists(fn) || !boost::filesystem::is_regular_file(fn))
        {
         cout << "ERROR: Input file does not exist or isn't a file:\t" << ifilenm << "\n";
         return -2;
        }
    }
 catch (const boost::filesystem::filesystem_error& ex)
    {
     cout << "ERROR: Failed accessing input file.  File doesn't exist or isn't a file or isn't accesible:\t" << ifilenm << "\n";
     return -3;
    }

Который, конечно, не запускается в этом вырожденном случае.Также нет глобальных переменных надстройки, инициализируемых перед выполнением.

Я пробовал это с установкой системной надстройки (1.53), а также со статическими и динамическими ссылками на надстройку 1.59, созданную с помощью компилятора g ++ 6.3.Такое же поведение.

Еще один бит ... есть еще одна версия этого исполняемого файла, которая получает доступ к некоторым дополнительным функциям через ссылки на некоторые другие сторонние библиотеки.Эта сборка не имеет этой проблемы.

Еще одна точка данных - если я перестраиваю весь бизнес с помощью компилятора CentOS 7 по умолчанию (g ++ 4.8.5), я не получаю эту ошибку.Но это вообще не вариант, потому что сторонние библиотеки, используемые для полной монти, требуют g ++ 6

Есть идеи, что происходит?Спасибо

...