Добавление выделения памяти и memset после предыдущего вызова string :: find заставляет его возвращать npos.Зачем? - PullRequest
0 голосов
/ 18 сентября 2018

Я занимаюсь разработкой игры под названием 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.

1 Ответ

0 голосов
/ 19 сентября 2018

Оказывается, причина этого в том, что string::find(const CharT* str, size_type pos = 0 ); ожидает нулевой терминатор для параметра str, и я подумал, что моему массиву char будет присвоен один автоматически.

Это не тот случай, и причина, по которой он работал раньше, была полностью обусловлена ​​удачей, что смежная память была 0x00, а теперь, когда я изменил код, смежная память была изменена на 0x40 и привела к строке :: find, ищущей неправильнуюстрока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...