C编程,使用BUFSIZ,malloc和memset的缺陷

时间:2014-09-12 07:18:36

标签: c malloc

我在C编程中遇到了这个问题:

问题:下面的代码片段中用零填充缓冲区的缺陷是什么?如何解决问题?

char*buf;
buf=malloc(BUFSIZ);
memset(buf,0,BUFSIZ);

我试图找到这个漏洞,但一切都适合我。如果上述C程序有任何缺陷,请告诉我。

2 个答案:

答案 0 :(得分:1)

//somewhere
const size_t BUFSIZE = 1000; //or it could be 0!
...
char *buf = NULL;
if (BUFSIZE > 0) {
    buf = (char*) malloc(BUFSIZ); //cast is not necessary on most compilers

    if (buf == NULL) {
        //some error processing
    } else {
        memset(buf, 0, BUFSIZ);
    }

    free(buf);
    buf = NULL;
}
  1. 将指针设置为NULL
  2. malloc正字节数,因为0的行为是特定于实现的
  3. 在malloc
  4. 之后检查它是否为空
  5. 免费记忆。如果它是NULL则没有任何反应
  6. 免费后取消指针
  7. cast malloc,一些编译器会发出警告,而不是错误。嗯,真的,不要施展
  8. 也许有一些像MISRA这样的标准,所以这段代码对于那个标准来说绝对无效
  9. 并且这可能是线程不安全的

答案 1 :(得分:0)

首先,malloc返回一个类型为'void'的指针,因此最好将其强制转换为 (char *)。第二件事“malloc”可能会失败,在那种情况下它会返回“NULL”指针,检查这个条件。我确信BUFSIZ是在代码中定义的!