📄 safemalloc.c
字号:
DBUG_PRINT("enter",("ptr: %lx",pPtr)); if (!sf_malloc_quick) (void) _sanity (sFile, uLine); if ((!pPtr && (myflags & MY_ALLOW_ZERO_PTR)) || check_ptr("Freeing",(byte*) pPtr,sFile,uLine)) DBUG_VOID_RETURN; /* Calculate the address of the remember structure */ pRec = (struct remember *) ((byte*) pPtr-sizeof(struct irem)- sf_malloc_prehunc); /* Check to make sure that we have a real remember structure */ /* Note: this test could fail for four reasons: */ /* (1) The memory was already free'ed */ /* (2) The memory was never new'ed */ /* (3) There was an underrun */ /* (4) A stray pointer hit this location */ if (*((long*) ((char*) &pRec -> lSpecialValue+sf_malloc_prehunc)) != MAGICKEY) { fprintf (stderr, "Freeing unallocated data at line %d, '%s'\n", uLine, sFile); DBUG_PRINT("safe",("Unallocated data at line %d, '%s'",uLine,sFile)); (void) fflush(stderr); DBUG_VOID_RETURN; } /* Remove this structure from the linked list */ pthread_mutex_lock(&THR_LOCK_malloc); if (pRec -> pPrev) { pRec -> pPrev -> pNext = pRec -> pNext; } else { pRememberRoot = pRec -> pNext; } if (pRec -> pNext) { pRec -> pNext -> pPrev = pRec -> pPrev; } /* Handle the statistics */ lCurMemory -= pRec -> uDataSize; cNewCount--; pthread_mutex_unlock(&THR_LOCK_malloc);#ifndef HAVE_purify /* Mark this data as free'ed */ bfill(&pRec->aData[sf_malloc_prehunc],pRec->uDataSize,(pchar) FREE_VAL);#endif *((long*) ((char*) &pRec -> lSpecialValue+sf_malloc_prehunc)) = ~MAGICKEY; /* Actually free the memory */ free ((my_string ) pRec); DBUG_VOID_RETURN;} /* Check if we have a wrong pointer */static int check_ptr(const char *where, byte *ptr, const char *sFile, uint uLine){ if (!ptr) { fprintf (stderr, "%s NULL pointer at line %d, '%s'\n", where,uLine, sFile); DBUG_PRINT("safe",("Null pointer at line %d '%s'", uLine, sFile)); (void) fflush(stderr); return 1; }#ifndef _MSC_VER if ((long) ptr & (MY_ALIGN(1,sizeof(char *))-1)) { fprintf (stderr, "%s wrong aligned pointer at line %d, '%s'\n", where,uLine, sFile); DBUG_PRINT("safe",("Wrong aligned pointer at line %d, '%s'", uLine,sFile)); (void) fflush(stderr); return 1; }#endif if (ptr < sf_min_adress || ptr > sf_max_adress) { fprintf (stderr, "%s pointer out of range at line %d, '%s'\n", where,uLine, sFile); DBUG_PRINT("safe",("Pointer out of range at line %d '%s'", uLine,sFile)); (void) fflush(stderr); return 1; } return 0;}/* * TERMINATE(FILE *file) * Report on all the memory pieces that have not been * free'ed as well as the statistics. */void TERMINATE (FILE *file){ struct remember *pPtr; DBUG_ENTER("TERMINATE"); pthread_mutex_lock(&THR_LOCK_malloc); /* Report the difference between number of calls to */ /* NEW and the number of calls to FREE. >0 means more */ /* NEWs than FREEs. <0, etc. */ if (cNewCount) { if (file) { fprintf (file, "cNewCount: %d\n", cNewCount); (void) fflush(file); } DBUG_PRINT("safe",("cNewCount: %d",cNewCount)); } /* Report on all the memory that was allocated with NEW */ /* but not free'ed with FREE. */ if ((pPtr=pRememberRoot)) { if (file) { fprintf(file, "Memory that was not free'ed (%ld bytes):\n",lCurMemory); (void) fflush(file); } DBUG_PRINT("safe",("Memory that was not free'ed (%ld bytes):",lCurMemory)); while (pPtr) { if (file) { fprintf (file, "\t%6u bytes at 0x%09lx, allocated at line %4u in '%s'\n", pPtr -> uDataSize, (ulong) &(pPtr -> aData[sf_malloc_prehunc]), pPtr -> uLineNum, pPtr -> sFileName); (void) fflush(file); } DBUG_PRINT("safe", ("%6u bytes at 0x%09lx, allocated at line %4d in '%s'", pPtr -> uDataSize, &(pPtr -> aData[sf_malloc_prehunc]), pPtr -> uLineNum, pPtr -> sFileName)); pPtr = pPtr -> pNext; } } /* Report the memory usage statistics */ if (file) { fprintf (file, "Maximum memory usage: %ld bytes (%ldk)\n", lMaxMemory, (lMaxMemory + 1023L) / 1024L); (void) fflush(file); } DBUG_PRINT("safe",("Maximum memory usage: %ld bytes (%ldk)", lMaxMemory, (lMaxMemory + 1023L) / 1024L)); pthread_mutex_unlock(&THR_LOCK_malloc); DBUG_VOID_RETURN;} /* Returns 0 if chunk is ok */static int _checkchunk (register struct remember *pRec, const char *sFile, uint uLine){ reg1 uint uSize; reg2 my_string magicp; reg3 int flag=0; /* Check for a possible underrun */ if (*((long*) ((char*) &pRec -> lSpecialValue+sf_malloc_prehunc)) != MAGICKEY) { fprintf (stderr, "Memory allocated at %s:%d was underrun,", pRec -> sFileName, pRec -> uLineNum); fprintf (stderr, " discovered at %s:%d\n", sFile, uLine); (void) fflush(stderr); DBUG_PRINT("safe",("Underrun at %lx, allocated at %s:%d", &(pRec -> aData[sf_malloc_prehunc]), pRec -> sFileName, pRec -> uLineNum)); flag=1; } /* Check for a possible overrun */ uSize = pRec -> uDataSize; magicp = &(pRec -> aData[uSize+sf_malloc_prehunc]); if (*magicp++ != MAGICEND0 || *magicp++ != MAGICEND1 || *magicp++ != MAGICEND2 || *magicp++ != MAGICEND3) { fprintf (stderr, "Memory allocated at %s:%d was overrun,", pRec -> sFileName, pRec -> uLineNum); fprintf (stderr, " discovered at '%s:%d'\n", sFile, uLine); (void) fflush(stderr); DBUG_PRINT("safe",("Overrun at %lx, allocated at %s:%d", &(pRec -> aData[sf_malloc_prehunc]), pRec -> sFileName, pRec -> uLineNum)); flag=1; } return(flag);} /* Returns how many wrong chunks */int _sanity (const char *sFile, uint uLine){ reg1 struct remember *pTmp; reg2 int flag=0; uint count=0; pthread_mutex_lock(&THR_LOCK_malloc); count=cNewCount; for (pTmp = pRememberRoot; pTmp != NULL && count-- ; pTmp = pTmp -> pNext) flag+=_checkchunk (pTmp, sFile, uLine); pthread_mutex_unlock(&THR_LOCK_malloc); if (count || pTmp) { const char *format="Safemalloc link list destroyed, discovered at '%s:%d'"; fprintf (stderr, format, sFile, uLine); fputc('\n',stderr); (void) fflush(stderr); DBUG_PRINT("safe",(format, sFile, uLine)); flag=1; } return flag;} /* _sanity */ /* malloc and copy */gptr _my_memdup(const byte *from, uint length, const char *sFile, uint uLine, myf MyFlags){ gptr ptr; if ((ptr=_mymalloc(length,sFile,uLine,MyFlags)) != 0) memcpy((byte*) ptr, (byte*) from,(size_t) length); return(ptr);} /*_my_memdup */my_string _my_strdup(const char *from, const char *sFile, uint uLine, myf MyFlags){ gptr ptr; uint length=(uint) strlen(from)+1; if ((ptr=_mymalloc(length,sFile,uLine,MyFlags)) != 0) memcpy((byte*) ptr, (byte*) from,(size_t) length); return((my_string) ptr);} /* _my_strdup */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -