Was könnte dies werden verursacht Pufferüberlauf?
Hallo, ich bin versucht zu kompilieren Sie den folgenden code,
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char a[3] = {'1', '2', '3'},b[3] = {'3', '2', '1'};
strcpy(a,b);
for(i=0; i<3; i++)
printf("%s",a);
return 0;
}
Aber ich erhalte die folgende Fehlermeldung(Buffer Overflow
)
*** buffer overflow detected ***: ./prog terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x48)[0xb7653ae8]
/lib/libc.so.6[0xb7651b30]
/lib/libc.so.6(__strcpy_chk+0x44)[0xb7650e14]
./prog[0x80484c9]
./prog[0x80483c1]
======= Memory map: ========
Nun habe ich nicht bekommen, was dazu führt, dass ein buffer-overflow hier. Kann bitte jemand mir helfen mit ihm?
Vielen Dank im adcance.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese:
Erstellt zwei Zeichen-arrays, halten Sie die strings "123" und "321" bzw. aber sind nicht NULL-terminiert. C-strings, per Konvention, müssen NULL-terminiert sein, oder andere Funktionen zu manipulieren, dass Sie (wie
strcpy
) nicht wissen, wo Sie enden. Sie müssen dies tun, um Ihnen den NULL-terminator:Beachten Sie auch, dass die Größe des arrays geändert von 3 zu 4, um Platz für die endende NULL. Sie könnten auch lassen Sie die Größe aus zu lassen der compiler bestimmen, welche Größe, um das array von der Suche, wie viele Dinge, die Sie in das initialiser Liste:
Wenn Sie Text in ein string-literal wie diese:
Fügt der compiler die NULL für Sie am Ende, was Sie wirklich tun, ist:
Welches ist, warum Sie don ' T haben, es zu tun, wenn Sie geben Sie Zeichen-arrays in double quotes.
Das problem ist, dass strcpy davon ausgegangen, dass es auf der Suche auf Zeichenfolgen. Der C-Konvention für strings ist, dass Sie beendet werden durch null-Zeichen. Deine arrays sind nicht so strcpy weiß nicht, Wann zu beenden.
Dieses Problem zu beheben, fügen Sie entweder eine 4. null-Zeichen oder strncpy verwenden.
Das fehlen der null-Terminierung wird auch ein Problem verursachen, wenn Sie printf.
beide
strcpy
undprintf
erwarten, dass im c-Stil0
-terminierte " strings. Ihrechar
arrays sind nicht0
-beendet.Also beide Funktionen gehen Verwüstung in den folgenden Blöcken von Speicher, bis Sie zu finden ein '\0' byte.