У меня возникли проблемы с пониманием этого .. так что пришло время обратиться за помощью.
ОС: OSX, Снежный барс
gcc: версия gcc для Xcode, 4.2.1
Библиотека: gmp, gmpxx
Проблема: функция падает прямо в конце с:
flx_run(94749) malloc: *** error for object 0x7fff706d1500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Program received signal SIGABRT, Aborted.
0x00007fff835cd886 in __kill ()
(gdb) bt
#0 0x00007fff835cd886 in __kill ()
#1 0x00007fff8366deae in abort ()
#2 0x00007fff83585a75 in free ()
#3 0x00000001000bca45 in flxusr::gmp__hyphen_0::_init_ ()
Previous frame inner to this frame (gdb could not unwind past this frame)
Я не вызываю free() в функции init, и функция работает корректно вплоть до закрывающей фигурной скобки... так что точка сбоя должна быть в деструкторах локальных объектов (правильно? )
Самое смешное:
а) Программа (кажется) работает нормально, если она статически связана, она дает сбой только в том случае, если код встроен в *.dylib и загружается динамически.
б) программа одинаково не работает с двумя совершенно разными версиями gmp/gmpxx. [4.3 или что-то и 5.01]
в) как статическая, так и динамическая версии компоновки отлично работают в Ubuntu 10.5 LTS.
Код генерируется моим компилятором, это не написанный от руки код. Пользовательский код запускается программой-драйвером верхнего уровня. Система успешно выполняет несколько сотен регрессионных тестов. однако в этом конкретном тестовом примере используется следующий написанный от руки код:
namespace flx { namespace gmp {
string flx_mpf_get_str(mpf_class const &a)
{
mp_exp_t x;
std::string s = a.get_str(x,10,0);
char b[100];
std::snprintf(b,100,"e%ld",(long)x);
return std::string(".")+s+b;
}
}}
но мне кажется нормально. Фрейм стека функции содержит несколько объектов mpz_class, mpq_class и mpf_class.
Помимо ошибок в gmp/gmpxx, единственное, о чем я могу думать, это то, что моя система времени выполнения или сгенерированный код портят память. «Освобождаемый» адрес, который не был выделен, вызывает подозрение (его нет рядом с кучей). Я создал версию gmp с флагом -g, но не получил больше информации (что говорит о том, что это неплохая свободная версия внутри деструктора класса gmpxx).
Мне нужны идеи! Я понятия не имею, где искать сейчас. Спасибо заранее :)
Ссылка на источник
http://felix-lang.org:1116/$/home/skaller/felix/felix/ сборка/оптимизированный выпуск/тест/gmp/gmp-0.cpp
Мета: уценка SO не работает! Так что придется копировать вручную.
С таким же успехом можно добавить ссылку на код Felix, так как он немного более читабелен и в нем есть кое-что интересное (например, определяемый пользователем синтаксис, и если вы перейдете в библиотеку, вы увидите, как создаются экземпляры классов типов)
http://felix-lang.org:1116/$/home/skaller/felix/felix/ сборка/оптимизированный выпуск/тест/gmp/gmp-0.flx