能力值:
( LV2,RANK:10 )
|
-
-
2 楼
顶一下。没人知道吗。
|
能力值:
( LV12,RANK:750 )
|
-
-
3 楼
是不是需要自己处理 SIGSEGV
我帮你google了下
http://stackoverflow.com/questions/2663456/write-a-signal-handler-to-catch-sigsegv
http://cs-pub.bu.edu/fac/richwest/cs591_w1/notes/wk3_pt2.PDF
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢,应用层是可以这样处理。内核层好像没有signal(.....)
能不能把下面的改写成内核层的。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
typedef int BOOL;
typedef unsigned int UINT;
typedef unsigned char BYTE;
#define TRUE 1
#define FALSE 0
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;
}
|
|
|