gpt4 book ai didi

c - 为什么使用gcc返回局部变量地址时得不到警告信息?

转载 作者:行者123 更新时间:2023-12-02 03:26:02 25 4
gpt4 key购买 nike

有两个函数,max1() 和 max2():

int* max1()
{
int a;
int b;

return &a;
}

int* max2()
{
int a;
int b;

return a > b ? &a : &b;
}

我们在使用gcc编译max1()时可以得到警告信息:

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.

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

最佳答案

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

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

没有。大号将警告视为一个很好的友好提示,表明您可能做了一些会给您带来麻烦的事情。但仅此而已:友好的说明。标准中没有任何内容说当您试图返回指向局部变量的指针时编译器应该警告您。大多数警告只是 - 警告 - 但(其中大部分)并不是严格要求的。归根结底,你的程序违反了规则,所以修复它是你的错——也是你的工作。在许多情况下编译器必须给出错误,但返回局部变量的指针不是其中之一。因此,首先要考虑自己很幸运能够收到该警告。

  • gcc 是否应该在这两个示例中警告您?这是错误吗?

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

但是,无论您说什么或做什么,您都不能指望编译器警告总是在您身边 - 他们只是一个好人,喜欢在蓝色月亮上帮助您一次。他并不总是在那里!

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

关于c - 为什么使用gcc返回局部变量地址时得不到警告信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com