HeapAlloc: Critical error detected c0000374
От: gwg-605 Россия  
Дата: 08.03.21 21:05
Оценка:
Народ! Получаю данный эксепшен. Из того, что нагуглил проблема связана с HEAP CORRUPTION.

Обычно при HEAP CORRUPTION выдается минимальная диагностика, блок рядом с которым произошла ошибка и тп. В данном случае ничего не выдается. Что значит эта ошибка? Error lookup не знает такой ошибки. В гугле тоже не нашел

Добавление _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF
| _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_CRT_DF );
Скрывает проблему

Проблема кроссплатформенная, на линуксе она тоже воспроизводится как Segmentation Fault, но пока не пробовал дебажить под линуксом (мне под виндой удобнее). Я понимаю, что мы где-то лазим по памяти, но удивляет отсутсвие диагностики. Развалы происходят в 100% запусков, в разных тредах, но всего пяток коллстеков с развалом. любое изменение кода в функциях из колстеков приводит к изменению комбинации коллстеков развала (что в общем понятно, что по памяти ходит другой тред).

Развал происходит при вызове:
_CrtMemBlockHeader* const header{static_cast<_CrtMemBlockHeader*>(HeapAlloc(__acrt_heap, 0, block_size))};

Самое удивительное, но развал происходит когда block_size = 56. других значений не видел, непонятно почему ???

Те задача стоит в том чтобы понять где поврежден хип?
Re: ASan
От: watchmaker  
Дата: 08.03.21 21:41
Оценка: 6 (1)
G6>понять где поврежден хип?

A AddressSanitizer что говорит?
Re[2]: ASan
От: gwg-605 Россия  
Дата: 08.03.21 23:14
Оценка:
Здравствуйте, watchmaker, Вы писали:

G6>>понять где поврежден хип?


W>A AddressSanitizer что говорит?


Показал багу! Спасибо огромное!!!

ЗЫ. Мы работаем по VS2017 пока.
Re[3]: ASan
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 09.03.21 11:43
Оценка: +1
Здравствуйте, gwg-605, Вы писали:

G6>ЗЫ. Мы работаем по VS2017 пока.

Ты бы сказал в чём была проблема что ли.
Sic luceat lux!
Re[4]: ASan
От: gwg-605 Россия  
Дата: 04.04.21 02:40
Оценка: 7 (1)
Здравствуйте, Kernan, Вы писали:

K>Ты бы сказал в чём была проблема что ли.

Да проблема стандартная, копи-пасте называется
Ну, а детали следующие:
Вызывается
void* ptr = malloc( 0 )

ptr — имеет реальное и валидное значение, а потом
memcpy( ptr, src, от 300 до 1500 байт )

Я так понимаю malloc с размером 0 хендлится несколько иначе, чем с реальным размером. И этот блок памяти с нулевым размером лежит в особом месте хипа, поэтому всякие защитные бордеры не сработали, и затирали мы походу важный кусок памяти.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.