Я компилирую свое приложение со сторонней библиотекой lib, и, похоже, есть странное поведение, которое предполагает проблему переполнения стека (это только предположение).
Но когда я добавляю оператор печати после сбойной строки, приложение работает нормально. Если я удаляю оператор печати (простой cout << «напечатать что-то» << endl; оператор), приложение падает на </p>
0x00007f48f2027276 in free () from /lib64/libc.so.6
Я попытался добавить следующий массив char вместо оператора print, и это также остановило сбой, затем я попытался распечатать содержимое массива char:
char ben[8000] = {0};
memset(&ben, 0, sizeof (ben));
for (int y = 0; y < 8000; ++y)
{
if (ben[y] != 0)
PRINT ("CHAR[%d]=%d", y, ben[y]);
}
чтобы увидеть, не повреждено ли что-либо в массиве, но этот подход не сработал. Поэтому мне было интересно, есть ли лучшие способы определить, является ли это проблемой переполнения стека?
Я перекомпилировал приложение с -fstack-protector-all (как lib, так и моим кодом), и это ничего не дало. Я также попробовал valgrind, и он не дал мне ничего подозрительного.
Похоже, что происходит сбой, потому что я пытаюсь освободить недопустимый указатель, но я понятия не имею, почему указатель недопустим, поскольку он освобождает локальную переменную (т.е. когда он выходит из области видимости). Указатель повреждается по какой-то причине, но это немного похоже на поиск иголки в стоге сена. Есть ли хорошие методы, чтобы попытаться сойтись на этом типе проблемы? Большое спасибо!