^ Linux – Friheden til at programmere: Version 2.5.20050330 – 2020-12-31 ^|
| [[program:vaerktoej-gettext|forrige]] | Kapitel 5. Programmørens værktøjskasse | [[program:vaerktoej-make|næste]] |
----
==== 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
#include
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 strengpegerenp, 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 encore-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.
----
| [[program:vaerktoej-gettext|forrige]] | [[program:index|hjem]] | [[program:vaerktoej-make|næste]] |
| Gettext | [[program:vaerktoej|op]] | Brug af oversættelsesfiler ("makefiles") |