jmalloc.c

来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 662 行 · 第 1/2 页

C
662
字号
/*      0 = no error detected                                   *//*--------------------------------------------------------------*/int j_memcheck(int CheckFree){    int status = 0;    MLINK *CurMal = MalTop;    /* Walk the alloc list */    if ( CheckFree >= 2 )    {        DBUG_PRINT("alloc", ("There should be %d unfreed blocks", memc));    }    while ( CurMal != NULL )    {        if ( CurMal->MAddr[CurMal->MSize] != CKBYT )        {            DBUG_PRINT("alloc", ("Memory overrun detected in link "            "allocated at %s Line %d", CurMal->MFile, CurMal->MLine));            status = -1;        }        if ( CheckFree >= 1 )        {            DBUG_PRINT("alloc", ("Unfreed block of size %d allocated at "            "%s Line %d", CurMal->MSize, CurMal->MFile, CurMal->MLine));            status = -1;        }        CurMal = CurMal->NextLink;    }    return(status);}/*-------------------------[ JMemValid ]------------------------*//*          Verify an address is in a JMalloc space             *//*--------------------------------------------------------------*/int JMemValid(char *Addr){    MLINK *CurMal = MalTop;    while ( CurMal != NULL )    {        if ( Addr >= CurMal->MAddr && Addr <= CurMal->MAddr + CurMal->MSize )            return(TRUE);        CurMal = CurMal->NextLink;    }    return(FALSE);}/*-------------------------[ JMemOwner ]------------------------*//*            Return the owner of a block of ram                *//*--------------------------------------------------------------*/static MLINK *JMemOwner(char *Addr){    MLINK *CurMal = MalTop;    while ( CurMal != NULL )    {        unsigned long Cur = (unsigned long)CurMal->MAddr,                      Adr = (unsigned long)Addr;        if ( Adr >= Cur && Adr <= Cur + CurMal->MSize )            return(CurMal);        CurMal = CurMal->NextLink;    }    return((void*)NULL);}/*-------------------------[ j_strcpy ]-------------------------*//*          String copy with checks and protections             *//*--------------------------------------------------------------*/char *j_strcpy(char *__dest, const char *__src, char *file, int line){    MLINK *MemOwner = JMemOwner(__dest);    if ( MemOwner == NULL )    {        DBUG_PRINT("alloc", ("Strcpy destination invalid - %s: line %d",            file, line));    }    else if ( strlen(__src) > MemOwner->MAddr + MemOwner->MSize - __dest )    {        DBUG_PRINT("alloc", ("Strcpy destination overrun - %s: line %d",            file, line));    }    return(strcpy(__dest, __src));}/*-------------------------[ j_strncpy ]------------------------*//*                 String n copy with checks                    *//*--------------------------------------------------------------*/char *j_strncpy(char *__dest, const char *__src, size_t maxlen, char *file,                int line){    MLINK *MemOwner = JMemOwner(__dest);    if ( MemOwner == NULL )    {        DBUG_PRINT("alloc", ("strncpy destination invalid - %s: line %d",            file, line));    }    else if ( maxlen > MemOwner->MAddr + MemOwner->MSize - __dest )    {        DBUG_PRINT("alloc", ("strncpy destination overrun - %s: line %d",            file, line));    }    return(strncpy(__dest, __src, maxlen));}char *j_strcat(char *__dest, char *__src, char *file, int line){    MLINK *MemOwner = JMemOwner(__dest);    if ( MemOwner == NULL )    {        DBUG_PRINT("alloc", ("strcat destination invalid - %s: line %d",            file, line));    }    else if ( strlen(MemOwner->MAddr) + strlen(__src) + 1 > MemOwner->MSize )    {        DBUG_PRINT("alloc", ("strcat destination overrun - %s: line %d",            file, line));    }    return(strcat(__dest, __src));}char *j_strdup(char *__str, char *file, int line){    char *p = j_malloc(strlen(__str) + 1, file, line);    if ( p != NULL )    {        j_strcpy(p, __str, file, line);    }    return(p);}char *j_strnset(char *str, int ch, size_t n, char *file, int line){    MLINK *MemOwner = JMemOwner(str);    if ( MemOwner == NULL )    {        DBUG_PRINT("alloc", ("strnset destination invalid - %s: line %d",            file, line));    }    return(strnset(str, ch, n));}char *j_strset(char *str, int ch, char *file, int line){    MLINK *MemOwner = JMemOwner(str);    if ( MemOwner == NULL )    {        DBUG_PRINT("alloc", ("strset destination invalid - %s: line %d",            file, line));    }    return(strset(str, ch));}/*------------------------[ j_checkstr ]------------------------*//*             Check a MLINK string for problems                *//* j_sprintf      sprintf replacement                           *//*--------------------------------------------------------------*/int j_checkstr(MLINK *str){    if ( str->MAddr[str->MSize] != CKBYT || strlen(str->MAddr) > str->MSize - 1 )    {        DBUG_PRINT("alloc",            ("Bad string, allocated at %s Line %d", str->MFile, str->MLine));        return 1;    }    return 0;}void *j_memcpy(void *dest, const void *src, size_t n, char *file, int line){    MLINK *MemOwner = JMemOwner(dest);    if ( MemOwner == NULL )    {        DBUG_PRINT("alloc", ("memcpy destination invalid - %s: line %d",            file, line));    }    else if ( n > MemOwner->MAddr + MemOwner->MSize - (char *)dest )    {        DBUG_PRINT("alloc", ("memcpy destination overrun - %s: line %d",            file, line));    }    return(memcpy(dest, src, n));}void *j_memset(void *dest, int ch, size_t n, char *file, int line){    MLINK *MemOwner = JMemOwner(dest);    if ( MemOwner == NULL )    {        DBUG_PRINT("alloc", ("memset destination invalid - %s: line %d",            file, line));    }    else if ( n > MemOwner->MAddr + MemOwner->MSize - (char *)dest )    {        DBUG_PRINT("alloc", ("memset destination overrun - %s: line %d",            file, line));    }    return(memset(dest, ch, n));}char *a_strcpy(char *__dest, const char *__src, int size, char *file,    int line){    if ( strlen(__src) >= size)        DBUG_PRINT("alloc", ("strcpy destination overrun - %s: line %d",            file, line));    return(strcpy(__dest, __src));}char *a_strncpy(char *dest, const char *src, size_t n, int size, char *file,    int line){    if ( n >= size )        DBUG_PRINT("alloc", ("strncpy destination overrun - %s: line %d",            file, line));    return(strncpy(dest, src, n));}char *a_strcat(char *dest, const char *src, int size, char *file, int line){    if ( strlen(dest) + strlen(src) + 1 > size )        DBUG_PRINT("alloc", ("strcat destination overrun = %s: line %d",            file, line));    return(strcat(dest, src));}char *a_strnset(char *str, int ch, size_t n, int size, char *file, int line){    if ( n + 1 > size )        DBUG_PRINT("alloc", ("strnset destination overrun - %s: line %d",            file, line));    return(strnset(str, ch, n));}void *a_memcpy(void *dest, const void *src, size_t n, int size, char *file,             int line){    if ( n > size )        DBUG_PRINT("alloc", ("memcpy destination overrun - %s: line %d",            file, line));    return(memcpy(dest, src, n));}void *a_memset(void *dest, int ch, size_t n, int size, char *file, int line){    if ( n > size )        DBUG_PRINT("alloc", ("memset destination overrun - %s: line %d",            file, line));    return memset(dest, ch, n);}#ifdef TEST#ifdef __WATCOMC__ #pragma off (unreferenced);#endif#ifdef __TURBOC__ #pragma argsused#endifint main(int argc, char *argv[]){    char *new,         *p,         *q,         r[30],         *s[256] = {NULL};    int i = 1;    while ( (p = argv[i++]) != NULL )    {        switch ( *p++ )            case '-':                switch ( *p++ )                    case '#':                        DBUG_PUSH(argv[i - 1]);    }    new = JCalloc(64, 56);    new = JRealloc(new, 64);    JStrCpy(new + 10, "Test string");    DBUG_PRINT("alloc", ("r is invalid"));    JStrCpy(r, "Test");    q = JCalloc(4, 4);    q[4 * 4] = 3;    DBUG_PRINT("alloc", ("p was never allocated"));    JFree(p);    i = 0;    DBUG_PRINT("alloc", ("Deplete memory"));    do    {        s[i] = JMalloc(32000);        i++;    } while ( s[i - 1] != NULL );    i = 0;    while ( s[i] != NULL )    {        JFree(s[i++]);    }    DBUG_PRINT("alloc", ("New and q are orphaned blocks"));    DBUG_PRINT("alloc", ("q has an overrun"));    JMemcheck(1);    return(0);}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?