247 lines
5.5 KiB
Plaintext
247 lines
5.5 KiB
Plaintext
|
_C CUSTOMIZED MEMORY ALLOCATORS_
|
|||
|
by Paul Anderson
|
|||
|
|
|||
|
[LISTING ONE]
|
|||
|
|
|||
|
|
|||
|
/* sym1.c - symbol table data types */
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include "xalloc.h"
|
|||
|
#include "defs.h"
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
Symbol *p1, *p2;
|
|||
|
char *ps = "test string";
|
|||
|
int *p5;
|
|||
|
|
|||
|
p1 = (Symbol *) xmalloc(sizeof(struct Symbol));
|
|||
|
p1->dtype = STRING;
|
|||
|
p1->val.pstring = xmalloc(strlen(ps) + 1);
|
|||
|
strcpy(p1->val.pstring, ps);
|
|||
|
|
|||
|
p2 = (Symbol *) xmalloc(sizeof(struct Symbol));
|
|||
|
p2->dtype = DOUBLE;
|
|||
|
p2->val.pdouble = (double *) xmalloc(sizeof(double));
|
|||
|
*p2->val.pdouble = 6.7e-13;
|
|||
|
|
|||
|
printf("%s\n", p1->val.pstring);
|
|||
|
printf("%g\n", *p2->val.pdouble);
|
|||
|
|
|||
|
p5 = (int *) xmalloc(30000 * sizeof(int));
|
|||
|
}
|
|||
|
|
|||
|
$ sym1
|
|||
|
test string
|
|||
|
6.7e-13
|
|||
|
file sym1.c - line 26: malloc error for 60000 bytes
|
|||
|
|
|||
|
|
|||
|
[LISTING TWO]
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <malloc.h>
|
|||
|
|
|||
|
#define MAXBUF 256 /* size of debug buffer */
|
|||
|
static char *dbuf[MAXBUF]; /* debug buffer */
|
|||
|
|
|||
|
/* ymalloc2.c - front end for malloc()
|
|||
|
Version 2
|
|||
|
*/
|
|||
|
|
|||
|
char *ymalloc(file, lineno, nbytes)
|
|||
|
char *file;
|
|||
|
int lineno;
|
|||
|
unsigned int nbytes;
|
|||
|
{
|
|||
|
char *pheap;
|
|||
|
void install();
|
|||
|
|
|||
|
pheap = malloc(nbytes);
|
|||
|
if (pheap == (char *) NULL) {
|
|||
|
fprintf(stderr,"file %s - line %d: malloc error for %u bytes\n",
|
|||
|
file, lineno, nbytes);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
install(pheap); /* place in debug buffer */
|
|||
|
return pheap;
|
|||
|
}
|
|||
|
|
|||
|
void install(pheap) /* store heap pointer in debug buffer */
|
|||
|
char *pheap;
|
|||
|
{
|
|||
|
register char **pbuf;
|
|||
|
|
|||
|
for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
|
|||
|
if (*pbuf == (char *) NULL) {
|
|||
|
*pbuf = pheap;
|
|||
|
return;
|
|||
|
}
|
|||
|
fprintf(stderr, "No room left in debug buffer\n");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
char *yrealloc(file, lineno, oldp, nbytes)
|
|||
|
char *file, *oldp;
|
|||
|
int lineno;
|
|||
|
unsigned int nbytes;
|
|||
|
{
|
|||
|
char *newp;
|
|||
|
register char **pbuf;
|
|||
|
short found = 0;
|
|||
|
|
|||
|
if (oldp != (char *) NULL)
|
|||
|
for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
|
|||
|
if (*pbuf == oldp) { /* find oldp's slot */
|
|||
|
found = 1;
|
|||
|
break;
|
|||
|
}
|
|||
|
if (!found) {
|
|||
|
fprintf(stderr,"file %s - line %d: realloc error for address %x\n",
|
|||
|
file, lineno, oldp);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
newp = realloc(oldp, nbytes);
|
|||
|
if (newp == (char *) NULL) {
|
|||
|
fprintf(stderr,"file %s - line %d: realloc error for %u bytes\n",
|
|||
|
file, lineno, nbytes);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
*pbuf = newp; /* replace in debug buffer's old slot */
|
|||
|
return newp;
|
|||
|
}
|
|||
|
|
|||
|
void yfree(file, lineno, pheap)
|
|||
|
char *file, *pheap;
|
|||
|
int lineno;
|
|||
|
{
|
|||
|
register char **pbuf;
|
|||
|
|
|||
|
if (pheap != (char *) NULL)
|
|||
|
for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
|
|||
|
if (*pbuf == pheap) {
|
|||
|
*pbuf = NULL;
|
|||
|
free(pheap);
|
|||
|
return;
|
|||
|
}
|
|||
|
fprintf(stderr,"file %s - line %d: free error for address %x\n",
|
|||
|
file, lineno, pheap);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
[LISTING THREE]
|
|||
|
|
|||
|
|
|||
|
/* sym2.c - more symbol table data types */
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include "xalloc.h"
|
|||
|
#include "defs.h"
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
Symbol *p1, *p2;
|
|||
|
char *ps = "test string";
|
|||
|
char *ps2 = "much longer test string";
|
|||
|
|
|||
|
p1 = (Symbol *) xmalloc(sizeof(struct Symbol));
|
|||
|
p1->dtype = STRING;
|
|||
|
p1->val.pstring = xmalloc(strlen(ps) + 1);
|
|||
|
strcpy(p1->val.pstring, ps);
|
|||
|
|
|||
|
p2 = (Symbol *) xmalloc(sizeof(struct Symbol));
|
|||
|
p2->dtype = DOUBLE;
|
|||
|
p2->val.pdouble = (double *) xmalloc(sizeof(double));
|
|||
|
*p2->val.pdouble = 6.7e-13;
|
|||
|
|
|||
|
printf("%s\n", p1->val.pstring);
|
|||
|
printf("%g\n", *p2->val.pdouble);
|
|||
|
|
|||
|
p1->val.pstring = xrealloc(p1->val.pstring, strlen(ps2) + 1);
|
|||
|
strcpy(p1->val.pstring, ps2);
|
|||
|
printf("%s\n", p1->val.pstring);
|
|||
|
|
|||
|
xfree((char *) p2->val.pdouble);
|
|||
|
xfree(ps2); /* free a bad pointer */
|
|||
|
}
|
|||
|
|
|||
|
$ sym2
|
|||
|
test string
|
|||
|
6.7e-13
|
|||
|
much longer test string
|
|||
|
file sym2.c - line 31: free error for address 2634
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Example 1: Out of bounds references
|
|||
|
|
|||
|
/* twzone.c - array out of bounds */
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
int buf[10];
|
|||
|
|
|||
|
buf[-4] = 1; /* negative subscript */
|
|||
|
buf[10] = 2; /* one step beyond */
|
|||
|
|
|||
|
printf("%d %d\n", *(buf - 4), *(buf + 10));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Example 2: Program that demonstartes xcalloc()
|
|||
|
|
|||
|
|
|||
|
/* neg.c - negative subscripts with xcalloc */
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
main()
|
|||
|
{
|
|||
|
char *xcalloc();
|
|||
|
int *p, *q;
|
|||
|
|
|||
|
p = (int *) xcalloc(10, sizeof(int));
|
|||
|
q = (int *) xcalloc(15, sizeof(int));
|
|||
|
|
|||
|
fill(p); /* fill with 10 numbers */
|
|||
|
display(p); /* print 10 numbers */
|
|||
|
|
|||
|
fill(q); /* fill with 15 numbers */
|
|||
|
display(q); /* print 15 numbers */
|
|||
|
}
|
|||
|
|
|||
|
$ neg
|
|||
|
1 2 3 4 5 6 7 8 9 10
|
|||
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
|||
|
|
|||
|
|
|||
|
Example 3: xcalloc() routine
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <malloc.h>
|
|||
|
#include <memory.h>
|
|||
|
|
|||
|
char *xcalloc(nitems, size) /* custom calloc() */
|
|||
|
unsigned nitems, size;
|
|||
|
{
|
|||
|
char *pheap;
|
|||
|
unsigned blksize;
|
|||
|
|
|||
|
blksize = nitems * size; /* size of chunk */
|
|||
|
|
|||
|
if ((pheap = malloc(blksize + sizeof(int))) == NULL) {
|
|||
|
fprintf(stderr, "Can't malloc on heap\n");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
*(int *)pheap = nitems; /* store no. of items in heap */
|
|||
|
|
|||
|
memset(pheap + sizeof(int), 0, blksize); /* zero the area */
|
|||
|
|
|||
|
return pheap + sizeof(int); /* pointer to data */
|
|||
|
}
|
|||
|
|
|||
|
|