2016-04-26 2 views
0

Ich schrieb einige Code in C, die strcpy einige Eingabedaten in einen deklarierten Puffer sollte. Hier ist der Code:C kopiert in zwei Puffer, obwohl nur einer gefüllt werden sollte

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

void function(char *args) { 
    char buff_1[12]; 
    char buff_2[3] = "ABC"; 

    strcpy(buff_1, args); 
    printf("buff_1: %s \n", buff_1); 
    printf("buff_2: %s \n", buff_2); 
} 

int main(int argc, char *argv[]) { 
    printf("Input: "); 

    if(argc > 1) 
    function(argv[1]); 

    return 0; 
} 

Wenn ich jetzt die binären laufen würde ich davon ausgehen, dass alles, was mehr als 11 Eingabeargumente in einem Puffer-Überlauf führen würden, aber in Wirklichkeit hängt es meine Eingabe an beiden Puffern:

./main (perl -e 'print "A"x15') 
buff_1: AAAAAAAAAAAAAAA 
buff_2 :ABCAAAAAAAAAAAAAAA 

Überprüfen Sie auch die Variablen, die mit gdb zeigt, dass meine Eingabeargumente in beiden Puffern gespeichert sind:

(gdb) x/1s buff_1 
0xffffd284: 'A' <repeats 11 times> 
(gdb) x/1s buff_2 
0xffffd281: "ABC", 'A' <repeats 11 times> 

ich den Code mit dem folgenden Befehl zusammengestellt: gcc -m32 -O0 -g -fno-stack-protector -o main main.c mit gcc (Ubuntu 5.2.1-22ubuntu2)

Kann jemand erklären, wie das möglich ist?

+0

Was, genau, denkst du, das Ergebnis eines Pufferüberlaufs * sollte * sein? –

+0

Wenn Sie die Adressen der Variablen (mit '% p') ausdrucken, sehen Sie, dass sie sich magisch nebeneinander ausrichten, also wird" ABC "(ohne die fehlende Null am Ende) mit buff_2's folgen Inhalt. – Koshinae

+1

Oder einfach nicht zählen, 'char buff_2 [] =" ABC ";'. Und aktivieren Sie Compiler-Warnungen. – Lundin

Antwort

4

Sie haben nicht genug Platz für null Terminierung für buff_2. So printf("buff_2: %s \n", buff_2); wird Ihren Puffer überlaufen, was zu undefined Verhalten führt.

char buff_2[3] = "ABC"; // Not enough space for \0 
char buff_2[4] = "ABC"; // OK 
char buff_2[] = "ABC"; // OK, Size will be 4 
+0

Mein Compiler wirft einen Fehler in dieser Zeile: 'char buff_2 [3] =" ABC ";': _'ABC ': array bounds overflow_ –

3

Das Schreiben von mehr Zeichen in einen Puffer als das, wo es Platz gibt, ruft undefiniertes Verhalten auf. Es gibt kein vorhersehbares Ergebnis; Sie können nichts davon annehmen, wenn Sie dies tun. Sie können nicht erwarten, immer einen deterministischen Laufzeitfehler zu erhalten.

Aus diesem Grund müssen Sie die Größe des Arguments überprüfen, bevor Sie es an strcpy übergeben. Ein Fehler ist nicht möglich.

Als Randnotiz haben Sie hier einen Fehler: char buff_2[3] = "ABC";. Es gibt nicht genug Platz für die Nullbeendigung. Dies bedeutet, dass Sie ein undefiniertes Verhalten aufrufen, wenn Sie versuchen, dieses Array zu drucken, da es sich nicht um eine gültige C-Zeichenfolge mit Nullende handelt.

Verwandte Themen