有两个函数,max1()和max2():
int* max1()
{
int a;
int b;
return &a;
}
int* max2()
{
int a;
int b;
return a > b ? &a : &b;
}
我们可以在编译max1()时使用gcc:
获取警告信息king@king:~/temp$ gcc test1.c
test1.c: In function ‘int* max()’:
test1.c:6:9: warning: address of local variable ‘a’ returned [-Wreturn-local-addr]
int a;
^
但是编译max2()时我们什么也得不到。
此外,我们可以通过clang获取警告信息:
king@king:~/temp$ clang test1.c
test1.c:9:21: warning: address of stack memory associated with local variable 'a' returned
[-Wreturn-stack-address]
return a > b ? &a : &b;
^
1 warning generated.
非常感谢并原谅我的英语池。
答案 0 :(得分:1)
在我看来,这个问题有2个部分:
没有。大不了。把警告想象成一个友好的友好记录,也许你做了一些让你陷入困境的事情。但它只不过是:友好的说明。标准中没有任何内容表示当您尝试返回指向局部变量的指针时,编译器应该发出警告。大多数警告只是 - 警告 - 但(大多数)并非严格要求。在一天结束时,您的程序违反了规则,因此修复它是您的错 - 也就是您的工作。在许多情况下,编译器必须提供错误,但返回指向局部变量的指针不是其中之一。因此,首先考虑自己很幸运能得到警告。
为了保持一致性,它应该。为什么不呢?如果它采用类似的代码,则可能需要在第二个示例中发出警告。这可能是gcc开发人员将其解释为一个错误(也就是说,调用任何代码中的错误来决定是否吐出警告 - 而不是核心编译器本身的错误)。
然而,无论你说什么或做什么,你根本不能依赖编译器警告总是在你身边 - 他们就是那个喜欢在蓝月亮中给你一只手的好人。他并不总是在那里!
注意:显然,启用优化后,gcc通常会在警告上更加详细。尝试使用优化进行编译,看看会发生什么。