typedef int BOOL;
typedef unsigned int UINT;
typedef unsigned char BYTE;
static BOOL g_bPtrTestInstalled;
static jmp_buf g_PtrTestJmpBuf;
void PtrTestHandler(int nSig)
{
if
(g_bPtrTestInstalled)
longjmp(g_PtrTestJmpBuf, 1);
}
BOOL __IsBadReadPtr(void* lp, UINT cb)
{
UINT i;
BYTE b1;
BOOL bRet = TRUE;
void (* pfnPrevHandler)(int);
g_bPtrTestInstalled = TRUE;
if
(setjmp(g_PtrTestJmpBuf))
{
bRet = FALSE;
goto Ret;
}
pfnPrevHandler = signal(SIGSEGV, PtrTestHandler);
for
(i = 0; i < cb; i ++)
b1 = ((BYTE*)lp)[i];
Ret:
g_bPtrTestInstalled = FALSE;
signal(SIGSEGV, pfnPrevHandler);
return
bRet;
}
int main()
{
int ptr = 0x8048000;
if
(__IsBadReadPtr((int *)ptr, 4))
printf
(
"mem value:%X\n"
, *(int *)ptr);
else
printf
(
"failed:0x%X\n"
,ptr);
return
0;
}