|
|
1.1 root 1: /* Test program for malloc errors are
2: * Error 1 area wrong after initialization
3: * Error 2 area wrong after realloc shrink
4: * Error 3 area wrong after realloc expand
5: * First number after error is what byte was expected
6: * Second number is what byte was found
7: * Third number is where
8: * Fourth number is size of area being looked at
9: */
10:
11: #define XSIZ 113
12: #include <stdio.h>
13:
14: extern char *malloc();
15: extern char *realloc();
16: extern void free();
17: extern unsigned rand();
18:
19: static unsigned mct, mfail, rct, rfail, ect, count;
20:
21: static struct mloc {
22: char *area;
23: unsigned siz;
24: } locs[XSIZ];
25:
26: unsigned
27: vsiz()
28: {
29: unsigned i;
30:
31: i = rand() >> 4;
32: return(i ? i : 10);
33: }
34:
35: mkval(siz, loc)
36: unsigned siz;
37: char *loc;
38: {
39: char fil=siz;
40:
41: for(;siz>0; siz--)
42: *loc++=fil;
43: }
44:
45: ckval(point, fill, siz, loc)
46: unsigned point, fill, siz;
47: char *loc;
48: {
49: char fil=fill, chx, *xloc=loc;
50: unsigned xsiz=siz;
51:
52: for(;siz>0; siz--) {
53: if((chx=*loc++) != fil) {
54: printf("Error: %d %x %x %d %d\n",
55: point, fil, chx, xsiz-siz, xsiz);
56: ect++;
57: return(1);
58: }
59: }
60: return(0);
61: }
62:
63: churn(loc)
64: struct mloc *loc;
65: {
66: unsigned nsiz;
67: char *savp;
68:
69: if(loc->area == NULL) { /* build an area */
70: mct++;
71: if(NULL != (loc->area=malloc(loc->siz=vsiz())))
72: mkval(loc->siz, loc->area);
73: else
74: mfail++;
75: return;
76: }
77: ckval(1, loc->siz, loc->siz, loc->area);
78: if(rand() & (1<<10)) { /* free or realloc */
79: free(loc->area);
80: loc->area=NULL;
81: count--; /* frees don't count */
82: } else {
83: rct++;
84: if(NULL != (savp=realloc(loc->area, nsiz=vsiz()))) {
85: loc->area=savp;
86: ckval(2+(loc->siz<nsiz), /* 2=contract 3=expand */
87: loc->siz, /* filler byte */
88: loc->siz<nsiz ? loc->siz : nsiz, /* size */
89: loc->area); /* area */
90: mkval(loc->siz=nsiz, loc->area);
91: }
92: else
93: rfail++;
94: }
95: }
96:
97: main(argc, argv) int argc; char *argv[];
98: {
99: if (argc > 1)
100: srand(atoi(argv[1]));
101:
102: for(count=0; count < XSIZ; count++)
103: locs[count].area = NULL;
104:
105: for(count=0; count<500; count++) {
106: churn(&locs[rand() % XSIZ]);
107: if(!memok())
108: printf("memok %d\n", count);
109: }
110:
111: printf("%4d mallocs %4d failed\n", mct, mfail);
112: printf("%4d reallocs %4d failed\n", rct, rfail);
113: printf("%d errors reported\n", ect);
114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.