我该如何修复这个简单的C溢出?

时间:2016-09-23 01:39:16

标签: c

我对此很新。我正在尝试重新编写此代码,以便删除在第12 + 19行中拾取的缓冲区溢出。

#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 个答案:

答案 0 :(得分:0)

因为您使用read函数来读取用户输入,所以您正在读取原始字节而不是字符串。因此它所读取的内容并不包含空终止字节,因此您不会有空终止字符串,因为malloc返回的缓冲区未初始化。

使用calloc代替malloc,它会返回初始化为全零的缓冲区。

inBuf = calloc(BUF_SIZE + 1, 1);

请注意,这会为终止空字符留下额外的字节。

您还应该检查read的返回值是否有错误,并且您不应该转换malloc / calloc / realloc的返回值

您的输出缓冲区大小也太小。它应该至少是输入字符串的大小加上格式字符串。

outBuf = (char*) malloc(BUF_SIZE + 1 + strlen(fmt));
相关问题