Annotation of coherent/e/bin/cku179/ckcmdb.c, revision 1.1

1.1     ! root        1: /*
        !             2:   C K C M D B . C  --  malloc debugger.
        !             3: */
        !             4: 
        !             5: /*
        !             6:   Author: Howie Kaye, Columbia University Center for Computing Activities.
        !             7:   Copyright (C) 1986, 1990 by The Trustees of Columbia University in
        !             8:   the City of New York.  Permission is granted to any individual or
        !             9:   institution to use, copy, or redistribute this software so long as it
        !            10:   is not sold for profit, provided this copyright notice is retained.
        !            11: */
        !            12: #include <stdio.h>
        !            13: #include "ckcdeb.h"
        !            14: /*
        !            15:   memdebug:
        !            16:   variable to control memory debugging.
        !            17:   if memdebug ==  1, then action is always taken.
        !            18:   if memdebug ==  0, then no action is taken.
        !            19:   if memdebug == -1, then the user is asked (works well with gdb).
        !            20: */
        !            21: int memdebug = -1;
        !            22: /*
        !            23:   To use this package, compile your program with:
        !            24:   -Dmalloc=dmalloc -Dfree=dfree =Dcalloc=dcalloc ... -DMDEBUG
        !            25:   and then link it with ckcmdb.c.
        !            26: */
        !            27: #ifdef MDEBUG
        !            28: /* Use the real ones in this module! */
        !            29: #ifdef malloc
        !            30: #undef malloc
        !            31: #endif /* malloc */
        !            32: #ifdef calloc
        !            33: #undef calloc
        !            34: #endif /* calloc */
        !            35: #ifdef realloc
        !            36: #undef realloc
        !            37: #endif /* realloc */
        !            38: #ifdef free
        !            39: #undef free
        !            40: #endif /* free */
        !            41: 
        !            42: char *malloc(), *realloc();
        !            43: char *set_range_check(), *check_range();
        !            44: 
        !            45: #define min(x,y) ((x) < (y) ? (x) : (y))
        !            46: #define RANGE "ABCDEFGHIJKLMNOP"
        !            47: #define INTSIZE  sizeof(int)
        !            48: #define LONGSIZE sizeof(long)
        !            49: #define RSIZE    sizeof(RANGE)
        !            50: #define RFRONT   min((RSIZE/2),LONGSIZE)
        !            51: #define RBACK    min((RSIZE-RFRONT),LONGSIZE)
        !            52: 
        !            53: char *
        !            54: dmalloc(size) int size; {
        !            55:     char *cp;
        !            56: 
        !            57:     cp = malloc(size + RSIZE + INTSIZE);
        !            58:     if (cp) {
        !            59:        cp = set_range_check(cp, size);
        !            60:        m_insert(cp);
        !            61:     }
        !            62:     return(cp);
        !            63: }
        !            64: 
        !            65: char *
        !            66: dcalloc(nelem, elsize) int nelem, elsize; {
        !            67:     char *cp;
        !            68: 
        !            69:     cp = dmalloc(nelem * elsize);
        !            70:     if (cp)
        !            71:        bzero(cp, nelem * elsize);
        !            72:     return(cp);
        !            73: }
        !            74: 
        !            75: char *
        !            76: drealloc(bp,size) char *bp; int size; {
        !            77:     char *cp;
        !            78: 
        !            79:     if (bp == NULL) {
        !            80:        maybe_quit("Freeing NULL pointer");
        !            81:     } else {
        !            82:        m_delete(bp);
        !            83:        cp = check_range(bp);
        !            84:     }
        !            85:     cp = realloc(cp, size + RSIZE + INTSIZE);
        !            86:     if (cp) {
        !            87:        cp = set_range_check(cp, size);
        !            88:        m_insert(cp);
        !            89:     }
        !            90:     return(cp);
        !            91: }
        !            92: 
        !            93: dfree(cp) char *cp; {
        !            94:     if (cp == NULL)
        !            95:        maybe_quit("Freeing NULL pointer");
        !            96:     else {
        !            97:        m_delete(cp);
        !            98:        cp = check_range(cp);
        !            99:     }
        !           100:     return(free(cp));
        !           101: }
        !           102: 
        !           103: char *
        !           104: set_range_check(cp,size) char *cp; int size; {
        !           105:     register int i;
        !           106:     int tmp = size;
        !           107: 
        !           108:     for(i = 0; i < INTSIZE; i++) {     /* set the size in the string */
        !           109:        cp[i] = tmp & 0xff;
        !           110:        tmp >>= 8;
        !           111:     }
        !           112:     cp += INTSIZE;                     /* skip the size */
        !           113: 
        !           114:     for(i = 0; i < RFRONT; i++)                /* set the front of the range check */
        !           115:        cp[i] = RANGE[i];               /* string */
        !           116: 
        !           117:     cp += RFRONT;                      /* skip the front range check */
        !           118: 
        !           119:     for(i = 0; i < RBACK; i++)         /* set the back odf the range check */
        !           120:        cp[i+size] = RANGE[i+RFRONT];
        !           121: 
        !           122:     return(cp);
        !           123: }
        !           124: 
        !           125: /*
        !           126:   Put calls to this routine in your code any place where you want to
        !           127:   check whether you've copied too many characters into a malloc'd space.
        !           128: */
        !           129: char *
        !           130: check_range(cp) char *cp; {
        !           131:     register char *bp = cp - RFRONT - INTSIZE;
        !           132:     char *xp = bp;
        !           133:     register int i;
        !           134:     int size = 0;
        !           135: 
        !           136:     for(i = 0 ; i < INTSIZE; i++) {    /* get the size out of the string */
        !           137:        size <<= 8;
        !           138:        size |= bp[INTSIZE-i-1] & 0xff;
        !           139:     }
        !           140:     bp += INTSIZE;
        !           141: 
        !           142:     for(i = 0; i < RFRONT; i++)                /* check front range check */
        !           143:        if (bp[i] != RANGE[i]) {
        !           144:            maybe_quit("leftside malloc buffer overrun");
        !           145:            break;
        !           146:        }
        !           147:     bp += RFRONT;                      /* skip front range check */
        !           148: 
        !           149:     for(i = 0; i < RBACK; i++)         /* check back rnage check */
        !           150:        if (bp[i+size] != RANGE[i+RFRONT]) {
        !           151:            maybe_quit("rightside malloc buffer overrun");
        !           152:            break;
        !           153:        }
        !           154:     return(xp);
        !           155: }
        !           156: 
        !           157: #define BUCKETS 10000
        !           158: char *m_used[BUCKETS];
        !           159: 
        !           160: VOID
        !           161: m_insert(cp) register char *cp; {
        !           162:     register int i;
        !           163: 
        !           164:     for(i = 0; i < BUCKETS; i++)
        !           165:        if (m_used[i] == 0) {
        !           166:            m_used[i] = cp;
        !           167:            return;
        !           168:        }
        !           169: }
        !           170: 
        !           171: VOID
        !           172: m_delete(cp) register char *cp; {
        !           173:     register int i;
        !           174: 
        !           175:     for(i = 0; i < BUCKETS; i++)
        !           176:        if (m_used[i] == cp) {
        !           177:            m_used[i] = 0;
        !           178:            return;
        !           179:        }
        !           180:     maybe_quit("Freeing unmalloc'ed pointer");
        !           181: }
        !           182: 
        !           183: VOID
        !           184: m_init() {
        !           185:     register int i;
        !           186:     for(i = 0; i < BUCKETS; i++)
        !           187:       m_used[i] = 0;
        !           188: }
        !           189: 
        !           190: VOID
        !           191: m_done() {
        !           192:     register int i,j;
        !           193: 
        !           194:     for(i = 0; i < BUCKETS; i++)
        !           195:        if (m_used[i] != 0) {
        !           196:            if (memdebug) {
        !           197:                if (j == 0)
        !           198:                    fprintf(stderr,"unfree'ed buffers, indices: ");
        !           199:                fprintf(stderr,"%d, ", i);
        !           200:                j++;
        !           201:            }
        !           202:        }
        !           203:     if (j)
        !           204:        fprintf(stderr,"\n");
        !           205:     if (j)
        !           206:        maybe_quit("Unfree'ed malloc buffers");
        !           207: }
        !           208: 
        !           209: VOID
        !           210: m_checkranges() {
        !           211:     int i;
        !           212: 
        !           213:     for ( i = 0; i < BUCKETS; i++)
        !           214:        if (m_used[i])
        !           215:            check_range(m_used[i]);
        !           216: }
        !           217: 
        !           218: static VOID
        !           219: maybe_quit(str) char *str; {
        !           220:     debug(F100,"mdebug maybe_quit","",0);
        !           221:     if (memdebug == 0)
        !           222:        return;
        !           223:     fprintf(stderr,"%s\n",str);
        !           224:     if (memdebug == 1)
        !           225:        abort();
        !           226:     if (memdebug == -1)
        !           227:        if (ask("Quit? "))
        !           228:            abort();
        !           229: }
        !           230: 
        !           231: static int
        !           232: ask(str) char *str; {
        !           233:     char buf[100];
        !           234:     FILE *in;
        !           235:     int fd;
        !           236:     
        !           237:     fd = dup(fileno(stdin));
        !           238:     in = fdopen(fd, "r");
        !           239:     while(1) {
        !           240:        fprintf(stderr,str);
        !           241:        fflush(stderr);
        !           242:        if (fgets(buf, 99, in) == NULL) /* EOF? */
        !           243:            return(0);
        !           244:        if (buf[0] == 'n' || buf[0] == 'N') {
        !           245:            fclose(in);
        !           246:            return(0);
        !           247:        }
        !           248:        if (buf[0] == 'y' || buf[0] == 'Y') {
        !           249:            fclose(in);
        !           250:            return(1);
        !           251:        }
        !           252:        fprintf(stderr,"please answer y/n.\n");
        !           253:     }
        !           254: }
        !           255: #endif /* MDEBUG */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.