Я занимаюсь разработкой игры под названием Monster Hunter World, чтобы добавить подпрограмму для обработки мыши, и в моем программном обеспечении появляется очень странная ошибка.Я не знаю точно, что является причиной этого, но я могу объяснить некоторые симптомы, и я сильно подозреваю, что повреждение памяти.
Проблема возникает, когда я использую string::find
в строке, содержащей весь двоичный файл MonsterHunterWorld.exe длянайти шаблон байта для механизма защиты, который проверяет суммы в файле и намеренно завершает работу программы, если обнаружены какие-либо изменения.До недавнего изменения моего кода мое программное обеспечение могло успешно находить эти байтовые шаблоны, следующие изменения в моем коде приводили к сбою функции string::find
:
char buffer2[5000];
memset(buffer2, 0, sizeof(buffer2));
Это происходит после того, как функция поискабыл вызван.Если я удаляю это из программы, он работает должным образом (вызов string :: find правильно находит шаблон байта, который я ищу).
Для справки весь исходный код программы можно найти в этой вставкеbin- https://pastebin.com/7ExgmXNZ
Что-то еще, что я проверил, я решил открыть программное обеспечение в x64dbg, я обнаружил, что шаблон, который я ищу с помощью string :: find, фактически находится в строке, которую он ищет, нопо какой-то причине он все равно не работает.
Исходный код был скомпилирован с 64-разрядной версией MingW 8.1.0
РЕДАКТИРОВАТЬ: изменен pastebin на минимальный код, необходимый для воспроизведения проблемы
ОБНОВЛЕНИЕ: мне удалось решить проблему для моей конкретной программы, но я не удовлетворен, так как не до конца понимаю, почему решение работает.В конец массива char, который я предоставляю в качестве параметра str
для string::find
, я вручную добавляю нулевое окончание 0x00
.Массивы AFAIK инициализируются следующим образом: в
char foo[] = {0x68, 0x69}; //"hi"
должны автоматически добавляться нулевые терминаторы?Если это не так, ПОЖАЛУЙСТА, исправьте меня, потому что это довольно серьезная ошибка с моей стороны, и это будет означать, что единственной причиной, по которой программа работала раньше, была глупая удача, что память, смежная с моим массивом символов, оказалась равной 0x00.