У меня есть некоторый код Visual C ++, который получает указатель на буфер с данными, которые должны быть обработаны моим кодом и длиной этого буфера. Из-за ошибки, находящейся вне моего контроля, иногда этот указатель попадает в мой код неинициализированным или непригодным для чтения иным образом (т.е. он вызывает сбой при попытке доступа к данным в буфере.)
Итак, мне нужно проверить этот указатель, прежде чем я его использую. Я не хочу использовать IsBadReadPtr или IsBadWritePtr, потому что все согласны с тем, что они глючат. (Используйте их в качестве примера.) Они также не являются поточно-ориентированными - это, вероятно, не является проблемой в этом случае, хотя поточно-ориентированное решение было бы неплохо.
Я видел предложения по достижению этой цели с помощью VirtualQuery или просто с помощью memcpy внутри обработчика исключений. Однако код, в котором необходимо выполнить эту проверку, чувствителен ко времени, поэтому мне нужна максимально эффективная проверка, которая также эффективна на 100%. Любые идеи будут оценены.
Просто чтобы прояснить: я знаю, что лучше всего было бы просто прочитать неверный указатель, позволить ему вызвать исключение, затем отследить его до источника и исправить реальную проблему. Однако в этом случае плохие указатели исходят из кода Microsoft, который я не могу контролировать, поэтому я должен их проверить.
Обратите внимание, что мне все равно, если указанные данные действительны. Мой код ищет конкретные шаблоны данных и будет игнорировать данные, если не найдет их. Я просто пытаюсь предотвратить сбой, возникающий при запуске memcpy для этих данных, и обработка исключения в точке, в которой выполняется попытка memcpy, потребует изменения дюжины мест в моем коде (но если бы у меня было что-то вроде IsBadReadPtr для вызова, я бы только нужно сменить код в одном месте).