Хрестоматия по программированию на Си в Unix



         

Примеры. Хрестоматия по программированию на Си в Unix - стр. 3


/* Коды ответа функции проверки */ #define OK 0 /* все хорошо */ #define DAMAGED 1 /* повреждена "погранзона" */ #define FREED 2 /* эта память уже освобождена */ #define NOTHERE (-1) /* нет в таблице */

/* Проверить сохранность "пограничных зон" */ int MEMcheckRecord(MemFileRecord *rec){ int code = OK; char *cptr; register i; AllocFrame *ptr = rec->ptr; size_t size = rec->size; size_t adjsize = rec->adjsize;

if(size == 0 && adjsize == 0){ printf("%p [%p] -- сегмент уже освобожден, " "record=#%d.\n", &ptr->stuff[0], ptr, rec->serial ); return FREED; } cptr = (char *) ptr; for(i=0; i < adjsize; i++){ if(i < RedZoneTypeSize i >= RedZoneTypeSize + size ){ /* головная погранзона ИЛИ хвостовая погранзона */ if( cptr[i] != red_table[ i % RedZoneTypeSize ] ){ printf("%p [%p] -- испорчен байт %4d [%4d]" "= 0x%02X '%c' record=#%d size=%lu.\n", &ptr->stuff[0], ptr, i - RedZoneTypeSize, i, cptr[i] & 0xFF, isprint(cptr[i] & 0xFF) ? cptr[i] & 0xFF : '?', rec->serial, size ); code = DAMAGED; } } } for(i=0; i < RedZoneTypeSize; i++) if(cptr[i] == free_table[i]){ printf("%p -- уже освобождено?\n", ptr); code = FREED; } if(code != OK) putchar('\n'); return code; }

/* Проверить сохранность памяти по указателю ptr. */ int MEMcheck_consistency(AllocFrame *ptr){ MemFileRecord mr_found; int nrecords, i, found = 0; size_t size;

MEMopenFd();

/* Ищем запись в таблице указателей */ lseek(mem_fd, 0L, SEEK_SET); /* перемотать в начало */ for(;;){ size = read(mem_fd, memrecords, sizeof memrecords); nrecords = size / sizeof(memrecords[0]);

if(nrecords <= 0) break;

for(i=0; i < nrecords; i++) if(memrecords[i].ptr == ptr){ /* Мы ищем последнюю запись про память * с таким адресом, поэтому * вынуждены прочитать ВЕСЬ файл. */ mr_found = memrecords[i]; found++; } } if(found) { return MEMcheckRecord(&mr_found); } else { printf("%p -- запись в таблице отсутствует.\n", ptr); return NOTHERE; } }




Содержание  Назад  Вперед