5.9. Electric Fence

Electric Fence er et bibliotek der er uvurderligt til hurtigt finde bufferoverløb eller -underløb. Et typisk problem i C og C++ (men praktisk taget ikke i nogle andre sprog) er at man allokerer en tabel, men forsøger at skrive efter tabellens slut eller før dens start. En anden typisk fejl er at allokere en streng der er for lille, som i dette eksempel:


#include <stdio.h>
#include <string.h>

int main(void)
{
   char* p=(char*)malloc(16*sizeof(char)); 
   char* q=(char*)malloc(16*sizeof(char)); 

// test for NULL

   strcpy(q,"efence test");
   strcpy(p,"efence test buffer overflow");  // 27 tegn lang!!

   printf("q:%s\n",q);
   printf("p:%s\n",p);
}

Oversættes dette program med gcc -o test test.c, så kan der ske alt muligt når det køres, men typisk vil det skrive:


q:low
p:efence test buffer overflow

En streng kopieres til strengpegeren p, men strengen er længere end den hukommelsesblok der er allokeret. Strcpy overskriver derfor delvist strengen q "efence test". Et program kan sagtens køre videre efter et bufferoverløb, men måske er dette bufferoverløb årsagen til at programmet fejler katastrofalt en halv time senere. Det kan derfor være uhyre svært at finde denne type fejl da de to ting tilsyneladende vil være helt urelaterede.

Oversættes programmet i stedet med gcc -o test test.c -ggdb -lefence vil programmet fejle og gemme en core-fil når det udfører den anden strcpy() linje. Køres ddd test core så vil debuggeren fortælle i hvilken linje bufferoverløbet skete. man efence giver en masse information om hvordan efence virker, og hvordan det kan bruges til at teste for bufferunderløb og meget andet.