访问函数,则可将越界检查置于访问函数内:
?
复制代码
?1 #ifdef CHK_GLOBAL_OVERRUN
?2 ? ? #define CODE_SIZE ? ? ? 4 ?//越界保护码的字节数
?3 ? ? #if (1 == CODE_SIZE)
?4 ? ? ? ? #define CODE_TYPE ? char
?5 ? ? ? ? #define CHK_CODE ? ?(CODE_TYPE)0xCC ? ? ? //除0外的特殊值
?6 ? ? #elif (2 == CODE_SIZE)
?7 ? ? ? ? #define CODE_TYPE ? short
?8 ? ? ? ? #define CHK_CODE ? ?(CODE_TYPE)0xCDDC ? ? //除0外的特殊值
?9 ? ? #else
10 ? ? ? ? #define CODE_TYPE ? int
11 ? ? ? ? #define CHK_CODE ? ?(CODE_TYPE)0xABCDDCBA //除0外的特殊值
12 ? ? #endif
13 ? ? #define CHK_HEAD ? ? ? ?CODE_TYPE ChkHead
14 ? ? #define CHK_TAIL ? ? ? ?CODE_TYPE ChkTail
15 ? ? #define HEAD_VAL(pvGlblAddr) ? ? ? ? ? ? (*(CODE_TYPE*)(pvGlblAddr))
16 ? ? #define TAIL_VAL(pvGlblAddr, dwGlbSize) ?(*(CODE_TYPE*)((char*)pvGlblAddr+dwGlbSize-sizeof(CODE_TYPE)))
17?
18 ? ? #define INIT_CHECK(pvGlblAddr, dwGlbSize) do{\
19 ? ? ? ? HEAD_VAL(pvGlblAddr) = TAIL_VAL(pvGlblAddr, dwGlbSize) = CHK_CODE;}while(0)
20 ? ? #define CHK_OVERRUN(pvGlblAddr, dwGlbSize, pFileName, dwCodeLine) do{\
21 ? ? ? ? if((HEAD_VAL(pvGlblAddr) != CHK_CODE) || (TAIL_VAL(pvGlblAddr, dwGlbSize) != CHK_CODE)) {\
22 ? ? ? ? ? ? printf("[%s(%d)]Memory Overrun(ChkHead:0x%X,ChkTail:0x%X)!\n", pFileName, dwCodeLine, \
23 ? ? ? ? ? ? HEAD_VAL(pvGlblAddr), TAIL_VAL(pvGlblAddr, dwGlbSize)); \
24 ? ? ? ? }}while(0)
25?
26 ? ? #define INIT_GLOBAL(pvGlblAddr, dwInitVal, dwGlbSize) \
27 ? ? ? ? ? ? InitGlobal(pvGlblAddr, dwInitVal, dwGlbSize, __FILE__, __LINE__)
28 ? ? #define SET_GLOBAL(pvGlblAddr, pvGlblVal, dwGlbSize) \
29 ? ? ? ? ? ? SetGlobal(pvGlblAddr, pvGlblVal, dwGlbSize, __FILE__, __LINE__)
30 ? ? #define GET_GLOBAL(pvGlblAddr, pvGlblVal, dwGlbSize) \
31 ? ? ? ? ? ? GetGlobal(pvGlblAddr, pvGlblVal, dwGlbSize, __FILE__, __LINE__)
32 #else
33 ? ? #define CHK_CODE ? ?0
34 ? ? #define CHK_HEAD
35 ? ? #define CHK_TAIL
36 ? ? #define HEAD_VAL(pvGlblAddr) ? ? ? ? ? ? ? 0
37 ? ? #define TAIL_VAL(pvGlblAddr, dwGlbSize) ? ?0
38 ? ? #define INIT_CHECK(pvGlblAddr, dwGlbSize)
39 ? ? #define CHK_OVERRUN(pvGlblAddr, dwGlbSize, pFileName, dwCodeLine)
40?
41 ? ? #define INIT_GLOBAL(pvGlblAddr, dwInitVal, dwGlbSize) do{\
42 ? ? ? ? ? ? memset(pvGlblAddr, dwInitVal, dwGlbSize);}while(0)
43 ? ? #define SET_GLOBAL(pvGlblAddr, pvGlblVal, dwGlbSize) do{\
44 ? ? ? ? ? ? memcpy(pvGlblAddr, pvGlblVal, dwGlbSize);}while(0)
45 ? ? #define GET_GLOBAL(pvGlblAddr, pvGlblVal, dwGlbSize) do{\
46 ? ? ? ? ? ? memcpy(pvGlblVal, pvGlblAddr, dwGlbSize);}while(0)
47 #endif
48?
49 void InitGlobal(void* pvGlblAddr, int dwInitVal, unsigned int dwGlbSize,
50 ? ? ? ? ? ? ? ? const char* pFileName, INT32U dwCodeLine)
51 {
52 ? ? if(NULL == pvGlblAddr)
53 ? ? {
54 ? ? ? ? printf("[%s(%d)]Null Pointer!\n", pFileName, dwCodeLine);
55 ? ? ? ? return;
56 ? ? }
57?
58 ? ? memset(pvGlblAddr, dwInitVal, dwGlbSize);
59 ? ? INIT_CHECK(pvGlblAddr, dwGlbSize);
60 }
61 void SetGlobal(void* pvGlblAddr, void* pvGlblVal, unsigned int dwGlbSize,
62 ? ? ? ? ? ? ? ?const char* pFileName, INT32U dwCodeLine)
63 {
64 ? ? if((NULL == pvGlblAddr) || (NULL == pvGlblVal))
65 ? ? {
66 ? ? ? ? printf("[%s(%d)]Null Pointer: (%p), (%p)!\n", pFileName, dwCodeLine, pvGlblAddr, pvGlblVal);
67 ? ? ? ? return;
68 ? ? }
69?
70 ? ? memcpy(pvGlblAddr, pvGlblVal, dwGlbSize);
71 ? ? CHK_OVERRUN(pvGlblAddr, dwGlbSize, pFileName, dwCodeLine);
72 }
73 void GetGlobal(v