【发布时间】:2010-12-06 15:13:57
【问题描述】:
现在,在人们开始将此标记为 dup 之前,我已经阅读了以下所有内容,但都没有提供我正在寻找的答案:
- C FAQ: What's wrong with casting malloc's return value?
- SO: Should I explicitly cast malloc()’s return value?
- SO: Needless pointer-casts in C
- SO: Do I cast the result of malloc?
C FAQ 和上述问题的许多答案都引用了一个神秘的错误,即强制转换malloc 的返回值可以隐藏;但是,它们都没有给出实践中这种错误的具体例子。现在注意我说的是error,而不是warning。
现在给出以下代码:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
使用 gcc 4.2 编译上述代码,使用和不使用强制转换都会给出相同的警告,并且程序可以正确执行并在两种情况下提供相同的结果。
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
那么任何人都可以给出一个具体的代码示例,说明由于转换 malloc 的返回值而可能发生的编译或运行时错误,或者这只是一个都市传说?
编辑关于这个问题,我遇到了两个写得很好的论点:
- 支持选角:CERT 咨询:Immediately cast the result of a memory allocation function call into a pointer to the allocated type
- Against Casting(2012 年 2 月 14 日出现 404 错误:使用 2010 年 1 月 27 日的 Internet Archive Wayback Machine 副本。{2016 年 3 月 18 日:“由于 robots.txt,无法抓取或显示页面。”})
【问题讨论】:
-
铸造
void指针允许将代码编译为C++;有人说这是一个功能,我会说这是一个错误;) -
另外,请阅读第一个链接的 cmets,因为它描述了您应该做什么而不是强制转换:securecoding.cert.org/confluence/display/seccode/…
-
我会接受 CERT 的建议,包括演员。另外,我永远不会忘记包含 stdlib.h。 :)
-
Here is a SO-example 编译运行时错误,因为在 64 位架构上转换为
malloc的返回值:转换为int*。 -
这个问题被标记为
C而不是C++(它们是两种不同的语言)所以任何讨论(如某些答案)都与这个问题无关。
标签: c