这段代码是不可移植的或者存在安全隐患吗?

3

我正在编写一些依赖于calloc的代码,并想知道如果calloc失败,将指针重定向到堆栈空间是否安全,然后在调用free()之前将指针设置为NULL或者完全跳过它。 在我的386 linux计算机上运行良好。

char *str = NULL;
int usestackspace = 0;
char str1[16] = {0};

str = (char *)calloc(1, sizeof(pid_t));

if (str == NULL) {
    sleep(1);
    str = (char *)calloc(1, sizeof(pid_t));
}

if (str == NULL) {
    fprintf(stderr, "watchdog: %s\n", strerror(errno));
    usestackspace = 1;
    str = str1;
}

if (str == NULL) {
    return -1;
}

freestr = NULL;是无意义的,但除此之外看起来还不错。 - Kerrek SB
你不应该在问题中没有任何指示的情况下编辑代码。我花了几分钟时间寻找一个自由变量,最后才意识到你已经将它从问题中删除了。 - cdietschrun
问题修订版4中的return -1;是无用代码。优化编译器可能会完全省略第三个if - Pascal Cuoq
1个回答

2
只要 str1 不超出其作用域,你的代码基本上是正确的。你有一个真正的错误(应该会生成警告,但在运行时可能无关紧要):
  • str = &str1 没有显式转换是无效的赋值。你可能想要使用 str = str1
一个潜在的问题:
  • 如果你依赖于 calloc 隐式设置内存为零,那么你需要初始化 str1。例如,使用 char str1[16] = { 0 } 或调用 memset
还有几个小注释:
  1. 在 C 程序中,你不必强制转换 calloc 的返回值。

  2. 你在 if 语句中有 free(str)str = NULL,但两者都是空操作——if 语句的条件确保 str 已经是 NULL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接