2016-09-23 189 views
-4

我對此很新。我想,以去除在線路12 + 19我該如何解決這個簡單的C溢出問題?

#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); 
} 

拿起如果有人能提供接近這一目標的最佳途徑一些有識之士的緩衝區溢出來重新編寫代碼?會非常感謝你。

+1

C <> C++。這不是C++代碼。請不要隨意添加標籤,因爲它們看起來很熟悉。標籤在此具有特定的含義和相關性。如果你不清楚你正在編寫哪種語言的代碼,你應該從鍵盤上取下你的手指,並在嘗試做其他事情之前弄清楚。另外,如果你想弄清楚如何解決這個問題,你應該有一些關於你如何嘗試這樣做的細節。這就像一個家庭作業,你試圖讓我們爲你回答。你覺得你應該怎麼做? –

+1

您正在讀取BUF_SIZE字符,然後將BUF_SIZE + 15寫入outbuf。另外,您不檢查讀取的結果。 – stark

+1

另外,'read'不會生成有效的C字符串。也就是說,它不會爲您添加NUL終結符。自己做:'r = read(0,inBuf,BUF_SIZE-1); inBuf [r] ='\ 0';'。請注意,這會在字符串的末尾留下換行符。 – kaylum

回答

0

由於您使用read函數來讀取用戶輸入,因此您正在讀取原始字節而不是字符串。因此,它讀入的內容不包含空終止字節,因此您沒有空終止字符串,因爲malloc返回的緩衝區未初始化。

使用calloc而不是malloc,它返回一個初始化爲全零的緩衝區。

inBuf = calloc(BUF_SIZE + 1, 1); 

請注意,這留下了一個額外的字節終止空字符。

您也應該檢查的read返回值是否有錯誤,你shoudn't投malloc/calloc/realloc返回值。

您的輸出緩衝區大小也太小。它至少應該是輸入字符串的大小加格式字符串。

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

應該分配'BUF_SIZE + 1',或手動編寫一個空終止符。你還需要解決'sprintf'格式字符串引起的溢出問題 –