2016-09-23 147 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'格式字符串引起的溢出问题 –