Как исправить ошибку malloc, которая возникает только в macOS High Sierra (10.13.6)?

#c #macos #memory #crash #sdl-2

#c #macos #память #сбой #sdl-2

Вопрос:

Последние несколько дней я боролся с ошибкой malloc, и у меня заканчиваются идеи по решению. Проект (воссоздание doom nukem на C и SDL2) отлично работает на macOS Mojave и Catalina (точные версии idk), но вылетает на моей ОС (High Sierra 10.13.6). Мы компилируем с помощью clang.

Ошибка:

 doom(76767,0x7fff9d07c380) malloc: *** error for object 0x7fe50486b800: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
[1]    76767 abort      ./doom
  

Я попытался просмотреть точные строки, в которых возникает ошибка, и, похоже, во всей программе доступны освобожденные переменные, хотя я избавился от всех вызовов free() (в целях тестирования). Вот тут я начинаю терять надежду.

Как может произойти нечто подобное? Я читал в другом сообщении SO, что проблема может быть не в недопустимом free, а в неправильном malloc. Как бы вы, ребята, подошли к поиску решения этой проблемы? Кроме того, почему эта проблема возникает только в 10.13, а не в mojave и catalina?

Довольно сложно публиковать примеры кода, поскольку нет ни одной конкретной строки, которая вызывает проблему. Если вы хотите взглянуть на код, я буду рад отправить вам ссылку на github.

Вывод Valgrind:

 ==81281== Command: ./doom
==81281==
--81281-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option
--81281-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times)
--81281-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times)
==81281== valgrind: Unrecognised instruction at address 0x103bd1b7b.
==81281==    at 0x103BD1B7B: _dispatch_kq_poll (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x103BD1741: _dispatch_kq_drain (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x103BD0B0F: _dispatch_kq_unote_update (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x103BCBE3E: _dispatch_source_refs_register (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x103BCBF68: _dispatch_source_finalize_activation (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x103BC4F54: _dispatch_queue_resume_finalize_activation (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x103FFC581: _notify_lib_init (in /usr/lib/system/libsystem_notify.dylib)
==81281==    by 0x103FFCB89: notify_register_dispatch (in /usr/lib/system/libsystem_notify.dylib)
==81281==    by 0x10079BD07: CFUniCharPrecompose (in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation)
==81281==    by 0x103BB3DB7: _dispatch_client_callout (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x103BB3D6A: dispatch_once_f (in /usr/lib/system/libdispatch.dylib)
==81281==    by 0x10079BBBD: CFUniCharPrecompose (in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation)```
  

Комментарии:

1. Вы неправильно управляете памятью, что приводит к неопределенному поведению. Запустите свой код через valgrind, и он скажет вам, что вы делаете неправильно.

2. Спасибо за совет. Я добавил вывод valgrind выше. Похоже, что это из-за несовместимости Unrecognised instruction . Возможно ли это?

3. если вы добавите -fsanitize=address (средство очистки адресов) в свою компиляцию и флаги ссылок, это может помочь вам обнаружить несоответствие памяти, как только это произойдет (при запуске вашей программы). К сожалению, неопределенное поведение может привести к сбою в одной системе, но не быть заметным в другой…

4. Ах, спасибо! Этот флаг дал мне действительно полезный результат. Я еще не решил ее, но, как мне кажется, она указала мне на источник проблемы.

5. как вы используете valgrind в macos?