Наиболее эффективная замена для IsBadReadPtr?

У меня есть некоторый код Visual C ++, который получает указатель на буфер с данными, которые должны быть обработаны моим кодом и длиной этого буфера. Из-за ошибки, находящейся вне моего контроля, иногда этот указатель попадает в мой код неинициализированным или непригодным для чтения по какой-либо другой причине (т.е. он вызывает сбой при попытке доступа к данным в буфере.)

Итак, мне нужно проверьте этот указатель, прежде чем я его использую. Я не хочу использовать IsBadReadPtr или IsBadWritePtr, потому что все согласны с тем, что они глючат. (Используйте их в качестве примера.) Они также не являются поточно-ориентированными - это, вероятно, не является проблемой в этом случае, хотя поточно-ориентированное решение было бы неплохо.

Я видел предложения по достижению этой цели с помощью VirtualQuery или просто с помощью memcpy внутри обработчика исключений. Однако код, в котором необходимо выполнить эту проверку, чувствителен ко времени, поэтому мне нужна максимально эффективная проверка, которая также эффективна на 100%. Любые идеи будут оценены.

Просто чтобы прояснить: я знаю, что лучше всего было бы просто прочитать неверный указатель, позволить ему вызвать исключение, затем отследить это до источника и исправить реальную проблему. Однако в этом случае плохие указатели исходят из кода Microsoft, который я не могу контролировать, поэтому я должен их проверить.

Также обратите внимание, что мне все равно, верны ли указанные данные. Мой код ищет определенные шаблоны данных и будет игнорировать данные, если не найдет их. Я просто пытаюсь предотвратить сбой, возникающий при запуске memcpy для этих данных, и обработка исключения в точке, в которой выполняется попытка memcpy, потребует изменения дюжины мест в устаревшем коде (но если бы у меня было что-то вроде IsBadReadPtr для вызова, я бы только нужно сменить код в одном месте).

8
задан jeffm 1 July 2019 в 17:42
поделиться

6 ответов

ориентированное на многопотоковое исполнение решение было бы хорошо

Я предполагаю, что это - только IsBadWritePtr, который не ориентирован на многопотоковое исполнение.

просто делая memcpy в обработчике исключений

Это эффективно, что IsBadReadPtr делает... и если бы Вы сделали это в своем коде, то затем Ваш код имел бы ту же ошибку как реализация IsBadReadPtr: http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx

Править:--

Единственная проблема с IsBadReadPtr, о котором я читал, состоит в том, что неверный указатель мог бы указывать (и таким образом, Вы могли бы случайно затронуть), защитная страница стека. Возможно, Вы могли избежать этой проблемы (и поэтому использовать IsBadReadPtr безопасно):

  • Знайте то, что потоки выполняют в Вашем процессе
  • Знайте, где стопки потоков, и насколько большой они
  • Спуститесь с каждого стека, delberately касающийся каждой страницы стека, по крайней мере, однажды, прежде чем Вы начнете называть isBadReadPtr

Кроме того, некоторые комментарии, связанные с URL выше также, предлагают использовать VirtualQuery.

9
ответ дан 5 December 2019 в 06:24
поделиться

Причина, которую эти функции плохи для использования, состоит в том, что проблема не может быть решена надежно.

Что, если функция Вы называете возвраты указателем на память, которая выделяется, таким образом, это выглядит допустимым, но это указывает на другой, несвязанные данные, и повредит Ваше приложение, если Вы будете использовать его.

Скорее всего, функция, которую Вы вызываете на самом деле, ведет себя правильно, и Вы неправильно используете ее. (Не гарантируемый, но это часто имеет место.)

Какая функция - это?

6
ответ дан 5 December 2019 в 06:24
поделиться

Почему Вы не можете назвать API

AfxIsValidAddress ((p), sizeof (тип), ЛОЖЬ));

1
ответ дан 5 December 2019 в 06:24
поделиться

если Вы используете VC ++ затем, я предлагаю использовать Microsoft определенные ключевые слова __ попытка __ кроме к и поймать исключения HW

-1
ответ дан 5 December 2019 в 06:24
поделиться

Я боюсь, что Вам не повезло - нет никакого способа надежно проверить законность указателя. Какой код Microsoft дает Вам неверные подсказки?

-1
ответ дан 5 December 2019 в 06:24
поделиться

Любая реализация проверки законности памяти подвергается тем же constriants, которые делают сбой IsBadReadPtr. Можно ли отправить стек вызовов в качестве примера того, где Вы хотите проверить, что законность памяти указателя передала Вам из Windows? Это могло бы помочь другим людям (включая меня), диагностируют, почему необходимо сделать это во-первых.

0
ответ дан 5 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: