2016-09-23 5 views
-4

Ich bin sehr neu dazu. Ich versuche, diesen Code, um neu zu schreiben den Pufferüberlauf zu entfernen, dieWie kann ich diesen einfachen C-Überlauf beheben?

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

#define BUF_SIZE (1024) 

int main(int argc, char* argv[]) { 
    char* inBuf; 
    char* outBuf; 
    char* fmt = "the winner is: %s"; 

    inBuf = (char*) malloc(BUF_SIZE); 
    if (inBuf == NULL) { 
    return -1; 
    } 
    read(0, inBuf, BUF_SIZE); 
    outBuf = (char*) malloc(BUF_SIZE); 
    if (outBuf == NULL) { 
    return -1; 
    } 
    sprintf(outBuf, fmt, inBuf); 
    fprintf(stdout, "%s\n", outBuf); 
    fprintf(stderr, "%s\n", outBuf); 
    free(inBuf); 
    free(outBuf); 
} 

in den Zeilen 12 + 19 aufgenommen wird, wenn jemand einen Einblick über den besten Weg, diesen Ansatz bieten könnte? wäre sehr dankbar, danke.

+1

C <> C++. Dies ist kein C++ - Code. Bitte fügen Sie keine Tags nach dem Zufallsprinzip hinzu, weil sie Ihnen bekannt vorkommen. Tags haben hier eine spezifische Bedeutung und Relevanz. Wenn Sie nicht wissen, in welcher Sprache Sie Code schreiben, sollten Sie Ihre Finger von der Tastatur nehmen und das herausfinden, bevor Sie versuchen, etwas anderes zu tun. Wenn Sie herausfinden möchten, * wie Sie dieses Problem beheben können, sollten Sie einige Details darüber wissen, wie Sie dies versucht haben. Das liest sich wie eine Hausaufgabe, die Sie uns beantworten lassen wollen. Wie denkst du, dass du fortfahren solltest? –

+1

Sie lesen BUF_SIZE Zeichen und schreiben dann BUF_SIZE + 15 in outbuf. Außerdem überprüfen Sie nicht das Leseergebnis. – stark

+1

Außerdem erzeugt 'read' keine gültige C-Zeichenfolge. Das heißt, es fügt keinen NUL-Terminator für Sie hinzu. Tun Sie das selbst: 'r = lesen (0, inBuf, BUF_SIZE-1); inBuf [r] = '\ 0'; '. Beachten Sie, dass am Ende der Zeichenfolge ein Newline-Zeichen verbleibt. – kaylum

Antwort

0

Da Sie die read-Funktion zum Lesen von Benutzereingaben verwenden, lesen Sie im Gegensatz zu einer Zeichenfolge rohe Bytes. Also, was es eingelesen hat, enthält kein null-terminierendes Byte, so dass Sie keine Null-terminierte Zeichenfolge haben, da der von malloc zurückgegebene Puffer nicht initialisiert ist.

Verwenden Sie calloc anstelle von malloc, die einen auf alle Nullen initialisierten Puffer zurückgibt.

inBuf = calloc(BUF_SIZE + 1, 1); 

Beachten Sie, dass dies ein zusätzliches Byte für ein abschließendes Nullzeichen belässt.

Sie sollten auch den Rückgabewert von read für einen Fehler werden überprüft, und Sie shoudn't den Rückgabewert von malloc/calloc/realloc gegossen.

Ihre Ausgabepuffergröße ist ebenfalls zu klein. Es sollte mindestens die Größe der Eingabezeichenfolge und der Formatzeichenfolge sein.

outBuf = (char*) malloc(BUF_SIZE + 1 + strlen(fmt)); 
+0

Sollte 'BUF_SIZE + 1' zugewiesen werden oder manuell einen Nullabschluss schreiben. Außerdem müssen Sie den Überlauf beheben, der durch die 'sprintf'-Formatzeichenfolge verursacht wird –

Verwandte Themen