Annotation of coherent/e/bin/ckermit/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) 1985, 1992, Trustees of Columbia University in the City of New
        !             8:   York.  Permission is granted to any individual or institution to use this
        !             9:   software as long as it is not sold for profit.  This copyright notice must be
        !            10:   retained.  This software may not be included in commercial products without
        !            11:   written permission of Columbia University.
        !            12: */
        !            13: #include <stdio.h>
        !            14: #include "ckcdeb.h"
        !            15: /*
        !            16:   memdebug:
        !            17:   variable to control memory debugging.
        !            18:   if memdebug ==  1, then action is always taken.
        !            19:   if memdebug ==  0, then no action is taken.
        !            20:   if memdebug == -1, then the user is asked (works well with gdb).
        !            21: */
        !            22: int memdebug = -1;
        !            23: int disabled = 0;
        !            24: int inited = 0;
        !            25: /*
        !            26:   To use this package, compile your program with:
        !            27:   -Dmalloc=dmalloc -Dfree=dfree =Dcalloc=dcalloc ... -DMDEBUG
        !            28:   and then link it with ckcmdb.c.
        !            29: */
        !            30: #ifdef MDEBUG
        !            31: /* Use the real ones in this module! */
        !            32: #ifdef malloc
        !            33: #undef malloc
        !            34: #endif /* malloc */
        !            35: #ifdef calloc
        !            36: #undef calloc
        !            37: #endif /* calloc */
        !            38: #ifdef realloc
        !            39: #undef realloc
        !            40: #endif /* realloc */
        !            41: #ifdef free
        !            42: #undef free
        !            43: #endif /* free */
        !            44: 
        !            45: char *malloc(), *realloc();
        !            46: char *set_range_check();
        !            47: char *check_range();
        !            48: char *maybe_check_range();
        !            49: 
        !            50: #define min(x,y) ((x) < (y) ? (x) : (y))
        !            51: #define RANGE "ABCDEFGHIJKLMNOP"
        !            52: #define INTSIZE  sizeof(int)
        !            53: #define LONGSIZE sizeof(long)
        !            54: #define RSIZE    sizeof(RANGE)
        !            55: #define RFRONT   min((RSIZE/2),LONGSIZE)
        !            56: #define RBACK    min((RSIZE-RFRONT),LONGSIZE)
        !            57: 
        !            58: char *
        !            59: dmalloc(size) int size; {
        !            60:     char *cp;
        !            61: 
        !            62:     cp = malloc(size + RSIZE + INTSIZE);
        !            63:     if (cp) {
        !            64:        cp = set_range_check(cp, size);
        !            65:        m_insert(cp);
        !            66:     }
        !            67:     return(cp);
        !            68: }
        !            69: 
        !            70: char *
        !            71: dcalloc(nelem, elsize) int nelem, elsize; {
        !            72:     char *cp;
        !            73: 
        !            74:     cp = dmalloc(nelem * elsize);
        !            75:     if (cp)
        !            76:        bzero(cp, nelem * elsize);
        !            77:     return(cp);
        !            78: }
        !            79: 
        !            80: char *
        !            81: drealloc(bp,size) char *bp; int size; {
        !            82:     char *cp;
        !            83: 
        !            84:     if (bp == NULL) {
        !            85:        maybe_quit("Freeing NULL pointer");
        !            86:     } else {
        !            87:        m_delete(bp);
        !            88:        cp = check_range(bp);
        !            89:     }
        !            90:     cp = realloc(cp, size + RSIZE + INTSIZE);
        !            91:     if (cp) {
        !            92:        cp = set_range_check(cp, size);
        !            93:        m_insert(cp);
        !            94:     }
        !            95:     return(cp);
        !            96: }
        !            97: 
        !            98: dfree(cp) char *cp; {
        !            99:     if (cp == NULL)
        !           100:        maybe_quit("Freeing NULL pointer");
        !           101:     else {
        !           102:        switch(m_delete(cp)) {
        !           103:        case 0:
        !           104:            cp = maybe_check_range(cp);
        !           105:            break;
        !           106:        case 1:
        !           107:            cp = check_range(cp);
        !           108:            break;
        !           109:        case 2:
        !           110:            break;
        !           111:        }
        !           112:     }
        !           113:     return(free(cp));
        !           114: }
        !           115: 
        !           116: char *
        !           117: set_range_check(cp,size) char *cp; int size; {
        !           118:     register int i;
        !           119:     int tmp = size;
        !           120: 
        !           121:     for(i = 0; i < INTSIZE; i++) {     /* set the size in the string */
        !           122:        cp[i] = tmp & 0xff;
        !           123:        tmp >>= 8;
        !           124:     }
        !           125:     cp += INTSIZE;                     /* skip the size */
        !           126: 
        !           127:     for(i = 0; i < RFRONT; i++)                /* set the front of the range check */
        !           128:        cp[i] = RANGE[i];               /* string */
        !           129: 
        !           130:     cp += RFRONT;                      /* skip the front range check */
        !           131: 
        !           132:     for(i = 0; i < RBACK; i++)         /* set the back odf the range check */
        !           133:        cp[i+size] = RANGE[i+RFRONT];
        !           134: 
        !           135:     return(cp);
        !           136: }
        !           137: 
        !           138: /*
        !           139:   Put calls to this routine in your code any place where you want to
        !           140:   check whether you've copied too many characters into a malloc'd space.
        !           141: */
        !           142: char *
        !           143: check_range(cp) char *cp; {
        !           144:     register char *bp = cp - RFRONT - INTSIZE;
        !           145:     char *xp = bp;
        !           146:     register int i;
        !           147:     int size = 0;
        !           148: 
        !           149:     for(i = 0 ; i < INTSIZE; i++) {    /* get the size out of the string */
        !           150:        size <<= 8;
        !           151:        size |= bp[INTSIZE-i-1] & 0xff;
        !           152:     }
        !           153:     bp += INTSIZE;
        !           154: 
        !           155:     for(i = 0; i < RFRONT; i++)                /* check front range check */
        !           156:        if (bp[i] != RANGE[i]) {
        !           157:            maybe_quit("leftside malloc buffer overrun");
        !           158:            break;
        !           159:        }
        !           160:     bp += RFRONT;                      /* skip front range check */
        !           161: 
        !           162:     for(i = 0; i < RBACK; i++)         /* check back range check */
        !           163:        if (bp[i+size] != RANGE[i+RFRONT]) {
        !           164:            maybe_quit("rightside malloc buffer overrun");
        !           165:            break;
        !           166:        }
        !           167:     return(xp);
        !           168: }
        !           169: 
        !           170: static char *
        !           171: maybe_check_range(cp) char *cp; {
        !           172:     register char *bp = cp - RFRONT - INTSIZE;
        !           173:     char *xp = bp;
        !           174:     register int i;
        !           175:     int size = 0;
        !           176: 
        !           177:     for(i = 0 ; i < INTSIZE; i++) {    /* get the size out of the string */
        !           178:        size <<= 8;
        !           179:        size |= bp[INTSIZE-i-1] & 0xff;
        !           180:     }
        !           181:     bp += INTSIZE;
        !           182: 
        !           183:     for(i = 0; i < RFRONT; i++)                /* check front range check */
        !           184:        if (bp[i] != RANGE[i]) {
        !           185:            return(cp);
        !           186:        }
        !           187:     bp += RFRONT;                      /* skip front range check */
        !           188: 
        !           189:     for(i = 0; i < RBACK; i++)         /* check back range check */
        !           190:        if (bp[i+size] != RANGE[i+RFRONT]) {
        !           191:            fprintf(stderr,"rightside malloc buffer overrun\n");
        !           192:            abort();
        !           193:            break;
        !           194:        }
        !           195:     return(xp);
        !           196: }
        !           197: 
        !           198: #define BUCKETS 10000
        !           199: char *m_used[BUCKETS];
        !           200: char *m_used2[BUCKETS];
        !           201: 
        !           202: VOID
        !           203: m_insert(cp) register char *cp; {
        !           204:     register int i;
        !           205: 
        !           206:     if (disabled)
        !           207:        return;
        !           208: 
        !           209:     for(i = 0; i < BUCKETS; i++)
        !           210:        if (m_used[i] == 0) {
        !           211:            m_used[i] = cp;
        !           212:            return;
        !           213:        }
        !           214:     disabled ++;
        !           215: }
        !           216: 
        !           217: static
        !           218: m_insert2(cp) register char *cp; {
        !           219:     register int i;
        !           220: 
        !           221:     if (disabled)
        !           222:        return;
        !           223:     for(i = 0; i < BUCKETS; i++)
        !           224:        if (m_used2[i] == 0) {
        !           225:            m_used2[i] = cp;
        !           226:            return;
        !           227:        }
        !           228:     disabled ++;
        !           229: }
        !           230: 
        !           231: VOID
        !           232: m_delete(cp) register char *cp; {
        !           233:     register int i;
        !           234: 
        !           235:     for(i = 0; i < BUCKETS; i++)
        !           236:        if (m_used[i] == cp) {
        !           237:            m_used[i] = 0;
        !           238:            return(1);
        !           239:        }
        !           240:     for(i = 0; i < BUCKETS; i++)
        !           241:        if (m_used2[i] == cp) {
        !           242:            m_used2[i] = 0;
        !           243:            return(2);
        !           244:        }
        !           245:     if (disabled) 
        !           246:        return(0);
        !           247: 
        !           248:     maybe_quit("Freeing unmalloc'ed pointer");
        !           249:     return(0);
        !           250: }
        !           251: 
        !           252: VOID
        !           253: m_init() {
        !           254:     register int i;
        !           255: 
        !           256:     inited = 1;
        !           257:     disabled = 0;
        !           258:     for(i = 0; i < BUCKETS; i++)
        !           259:       m_used[i] = 0;
        !           260: }
        !           261: 
        !           262: VOID
        !           263: m_done() {
        !           264:     register int i,j=0;
        !           265: 
        !           266:     if (disabled) 
        !           267:        return;
        !           268:     for(i = 0; i < BUCKETS; i++)
        !           269:        if (m_used[i] != 0) {
        !           270:            if (memdebug) {
        !           271:                if (j == 0)
        !           272:                    fprintf(stderr,"unfree'ed buffers, indices: ");
        !           273:                fprintf(stderr,"%d, ", i);
        !           274:                j++;
        !           275:            }
        !           276:        }
        !           277:     if (j)
        !           278:        fprintf(stderr,"\n");
        !           279:     for(i = 0; i < BUCKETS; i++)
        !           280:        if (m_used2[i] != 0) {
        !           281:            if (memdebug) {
        !           282:                if (j == 0)
        !           283:                    fprintf(stderr,"unfree'ed registered buffers, indices: ");
        !           284:                fprintf(stderr,"%d, ", i);
        !           285:                j++;
        !           286:            }
        !           287:        }
        !           288:     if (j)
        !           289:        fprintf(stderr,"\n");
        !           290:     if (j)
        !           291:        maybe_quit("Unfree'ed malloc buffers");
        !           292: }
        !           293: 
        !           294: VOID
        !           295: m_checkranges() {
        !           296:     int i;
        !           297: 
        !           298:     for ( i = 0; i < BUCKETS; i++)
        !           299:        if (m_used[i])
        !           300:            check_range(m_used[i]);
        !           301: }
        !           302: 
        !           303: static VOID
        !           304: maybe_quit(str) char *str; {
        !           305:     debug(F100,"mdebug maybe_quit","",0);
        !           306:     if (memdebug == 0)
        !           307:        return;
        !           308:     fprintf(stderr,"%s\n",str);
        !           309:     if (memdebug == 1)
        !           310:        abort();
        !           311:     if (memdebug == -1)
        !           312:        if (ask("Quit? "))
        !           313:            abort();
        !           314: }
        !           315: 
        !           316: static int
        !           317: ask(str) char *str; {
        !           318:     char buf[100];
        !           319:     FILE *in;
        !           320:     int fd;
        !           321:     
        !           322:     fd = dup(fileno(stdin));
        !           323:     in = fdopen(fd, "r");
        !           324:     while(1) {
        !           325:        fprintf(stderr,str);
        !           326:        fflush(stderr);
        !           327:        if (fgets(buf, 99, in) == NULL) /* EOF? */
        !           328:            return(0);
        !           329:        if (buf[0] == 'n' || buf[0] == 'N') {
        !           330:            fclose(in);
        !           331:            return(0);
        !           332:        }
        !           333:        if (buf[0] == 'y' || buf[0] == 'Y') {
        !           334:            fclose(in);
        !           335:            return(1);
        !           336:        }
        !           337:        fprintf(stderr,"please answer y/n.\n");
        !           338:     }
        !           339: }
        !           340: #endif /* MDEBUG */

unix.superglobalmegacorp.com

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