Если вы создаете используемый тип, вы можете включить в его состав некоторую идентифицирующую информацию, которая поможет вам исключить некоторые указатели типа void, которые не относятся к тому типу, который вы ищете.Хотя у вас есть шанс, что некоторая случайная область памяти будет содержать те же данные или сигнатуру, что и искомая вами, по крайней мере вы будете знать, когда что-то не соответствует типу, который вы искали.
Этот подходпотребует, чтобы структура была инициализирована таким образом, чтобы члены подписи, используемые для определения, является ли область памяти недействительной, инициализируются значением подписи.
Пример:
typedef struct {
ULONG ulSignature1;
// .. data elements that you want to have
ULONG ulSignature2;
} MySignedStruct;
#define MYSIGNEDSTRUCT_01 0x1F2E3D4C
#define MYSIGNEDSTRUCT_02 0xF1E2D3C4
#define IS_MY_STRUCT(sAdr) ( (((MySignedStruct *)sAdr)->ulSignature1 == MYSIGNEDSTRUCT_01 ) && (((MySignedStruct *)sAdr)->ulSignature1 == MYSIGNEDSTRUCT_02))
Это грубый подход, однако он может помочь.Естественно, использование макроса типа IS_MY_STRUCT()
, где аргумент используется дважды, может быть проблематичным, если аргумент имеет побочный эффект, поэтому вам следует быть осторожным с чем-то вроде IS_MY_STRUCT(xStruct++)
, где xStruct
- указатель на MySignedStruct
.