linuxbog:program:vaerktoej-efence
| Linux – Friheden til at programmere: Version 2.5.20050330 – 2020-12-31 | ||
|---|---|---|
| forrige | Kapitel 5. Programmørens værktøjskasse | 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:<code>#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);
}</code>
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:<code>q:low
p:efence test buffer overflow</code>
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.
linuxbog/program/vaerktoej-efence.txt · Last modified: by 127.0.0.1
