返回本地变量的地址时为什么不能获取警告信息?

时间:2015-05-14 15:05:29

标签: c gcc warnings gcc-warning

有两个函数,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.

非常感谢并原谅我的英语池。

1 个答案:

答案 0 :(得分:1)

在我看来,这个问题有2个部分:

  • 编译器总是是否应该在每次做坏事时警告你?

没有。大不了。把警告想象成一个友好的友好记录,也许你做了一些让你陷入困境的事情。但它只不过是:友好的说明。标准中没有任何内容表示当您尝试返回指向局部变量的指针时,编译器应该发出警告。大多数警告只是 - 警告 - 但(大多数)并非严格要求。在一天结束时,您的程序违反了规则,因此修复它是您的错 - 也就是您的工作。在许多情况下,编译器必须提供错误,但返回指向局部变量的指针不是其中之一。因此,首先考虑自己很幸运能得到警告。

  • 两个例子中gcc都应警告你吗?这是一个错误吗?

为了保持一致性,它应该。为什么不呢?如果它采用类似的代码,则可能需要在第二个示例中发出警告。这可能是gcc开发人员将其解释为一个错误(也就是说,调用任何代码中的错误来决定是否吐出警告 - 而不是核心编译器本身的错误)。

然而,无论你说什么或做什么,你根本不能依赖编译器警告总是在你身边 - 他们就是那个喜欢在蓝月亮中给你一只手的好人。他并不总是在那里!

注意:显然,启用优化后,gcc通常会在警告上更加详细。尝试使用优化进行编译,看看会发生什么。