意外的 gcc 警告:函数返回局部变量的地址 - 这是编译器错误吗?

2024-01-26

以下是最小的工作示例(好吧,实际上它是最小的非工作示例:-))。当使用 gcc(从版本 5.0 到 9.3)编译时,它会发出以下警告。它甚至似乎只在发布版本中发出警告(-02及更高)。

Code:

class A
{
};

class B
{
    const A& getA() const
    {
        static A a;
        return a;
    }
    const A& get(bool b) const; 
};

const A& B::get(bool b) const
{
    return static_cast<const A&>(b ? getA() : getA());
}

int main(int argc, char** argv)
{
    return 0;
}

编译器输出:

<source>: In member function 'const A& B::get(bool) const':
<source>:17:50: warning: function returns address of local variable [-Wreturn-local-addr]
  return static_cast<const A&>(b ? getA() : getA());
<source>:17:50: note: declared here
  return static_cast<const A&>(b ? getA() : getA());
Compiler returned: 0

上面的代码在 MSVC 和 clang 中都可以正常编译,甚至在 gcc 10.1 中也能正常编译。它在调试中也可以正常编译(使用-O1 or -O0)与较旧的 gcc 版本。

您能看到代码中有什么不正确的地方吗?还是这确实是编译器问题?

观察

当我向 A 类添加删除的复制构造函数时(A(const A&) = delete;),警告消失并且编译器停止创建局部变量。

Try你可以试穿gcc.godbolt.org https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(fontScale:14,j:1,lang:c%2B%2B,selection:(endColumn:3,endLineNumber:3,positionColumn:3,positionLineNumber:3,selectionStartColumn:3,selectionStartLineNumber:3,startColumn:3,startLineNumber:3),source:'class+A%0A%7B%0A%7D%3B%0A%0Aclass+B%0A%7B%0A%09const+A%26+getA()+const%0A%09%7B%0A%09%09static+A+a%3B%0A%09%09return+a%3B%0A%09%7D%0A%09const+A%26+get(bool+b)+const%3B%09%0A%7D%3B%0A%0Aconst+A%26+B::get(bool+b)+const%0A%7B%0A%09return+static_cast%3Cconst+A%26%3E(b+%3F+getA()+:+getA())%3B%0A%7D%0A%0Aint+main(int+argc,+char**+argv)%0A%7B%0A++++return+0%3B%0A%7D%0A'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:47.14654580796961,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g510,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'1',trim:'1'),fontScale:14,j:1,lang:c%2B%2B,libs:!(),options:'-O3',selection:(endColumn:12,endLineNumber:6,positionColumn:12,positionLineNumber:6,selectionStartColumn:12,selectionStartLineNumber:6,startColumn:12,startLineNumber:6),source:1),l:'5',n:'0',o:'x86-64+gcc+5.1+(Editor+%231,+Compiler+%231)+C%2B%2B',t:'0')),k:16.805462296066587,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compiler:1,editor:1,fontScale:14,wrap:'1'),l:'5',n:'0',o:'%231+with+x86-64+gcc+5.1',t:'0')),k:36.04799189596379,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

意外的 gcc 警告:函数返回局部变量的地址 - 这是编译器错误吗? 的相关文章

随机推荐

  • 如果存在具有相同名称的方法的 Mixin,如何调用超类方法

    重复方法行为 The 代码 这里作为要点 https dartpad dartlang org 10e4a4fe0cc01c7eb5ec926ff9a4cebb将打印e 如果我删除覆盖 即删除output from Baz 它将打印w fr
  • Java PBEWithMD5AndDES

    我正在使用基于密码的加密 我最初的想法是使用 AES 来加密包含密码的文件 结果基于密码的加密不支持 AES 它使用 DES AFAIK des 并不安全 PBEWithMD5AndDES 是否足够安全 足以推送我的数据 还是我应该寻找其他
  • 检查共享目录权限 - C#

    我想编写一段代码来检查共享目录权限 我检查了多个解决方案 但在尝试获取本地目录权限时效果很好 但当我为共享目录制作测试用例时它会失败 我在这个问题中尝试举例 SOF 检查网络中的目录和文件写入权限 https stackoverflow c
  • 寻找最短路径时,广度优先搜索如何工作?

    我做了一些研究 我似乎遗漏了这个算法的一小部分 我了解广度优先搜索的工作原理 但我不明白它到底如何让我到达特定路径 而不是仅仅告诉我每个单独的节点可以去哪里 我想解释我的困惑的最简单方法是提供一个例子 举例来说 假设我有一个这样的图表 我的
  • 在 Heroku 上,rake db:migrate 失败并显示“数据库配置未指定适配器”

    我已经按照导轨教程 http ruby railstutorial org chapters a demo app version 3 2 sec 3adeploying the demo app直到链接点 这是外壳输出 jrhorn424
  • 如何每三个字符插入一个空格,直到一个句点字符?

    我一直在尝试将输入格式设置为每三个字符有一个空格 直到句点字符 例如 999999999 gt 999 999 999 33333 25 gt 33 333 25 222 32 gt 222 32 4444 gt 4444 这是我到目前为止
  • 在 Beaglebone 中使用 openCV 编译 C++ 代码

    我用 C 编写了以下代码 使用 openCV 在 Beaglebone 中运行 include
  • Javascript 模块中的变量在其外部可见吗?

    首先 我来自 NET 世界 那里有静态类 C 在 VB 中也称为模块 和实例类 您可以实例化它们 这个问题是关于 Javascript 的 我试图重新创建我已经知道的模式并创建一个模块 静态类 这是代码 var MyModule varia
  • 重用需要“resolve”参数的“ui-route”控制器

    我希望能够重复使用我的ui router 有线控制器 他们目前从以下位置接收参数ui router resolve渲染他们的模板 我可以重复使用这些控制器吗 ui router 例如 我这样做ui router controller Det
  • Python3中的mimetools.choose_boundary函数在哪里?

    我目前想在Python3中使用以下代码 但发现该函数mimetools choose boundary要弃用 如何更改代码并使其正常工作 import re from urllib request import urlopen Reques
  • Guice JPA - “此连接已关闭。”错误

    在数据库断开空闲连接或数据库关闭并备份后 我在我的网络应用程序中收到以下错误 javax persistence PersistenceException org hibernate exception JDBCConnectionExce
  • async.mapLimit 与 Promise

    我正在尝试使用 async 模块 v3 尤其是 async mapLimit 方法来提交有限数量的并行异步请求 这与以下 简化的 示例代码中的回调配合使用效果很好 async require async async mapLimit 1 2
  • 如何使用用户脚本覆盖警报功能?

    现场有这样的代码 其站点位于 LAN 上 我尝试使用 GM 禁用该警报 我正在尝试这样做 unsafeWindow alert function 但我看到警报并收到此错误 Error uncaught exception Exception
  • Python 3 网页抓取选项

    我是 Python 新手 所以如果这是一个新手问题 我很抱歉 我正在尝试构建一个涉及网络抓取的程序 我注意到 Python 3 的网络抓取模块似乎比 Python 2 x 系列少得多 Beautiful Soup mechanize 和 s
  • 如何在 Android 中为 Fragment 设置标签

    我查看了 Stackoverflow 上的所有问题 但找不到这个问题的唯一明确答案 你怎么将标签设置为Fragment这样你就可以通过以下方式检索它getFragmentManager findFragmentByTag 有人可以给出一个简
  • 保存为 .ps/.eps 时 Matplotlib 绘图失去透明度

    如果我尝试使用 ps eps 扩展名保存一些带有透明椭球体的绘图 我会遇到问题 Here s the plot saved as a png If I choose to save it as a ps eps here is what i
  • 为什么我不能在 python3 中子类化元组?

    让我们先说一下这个问题你应该使用 new 代替 init 用于子类化不可变对象 https stackoverflow com questions 399022 why cant i subclass datetime date 话虽如此
  • webGL 中的平面着色

    我正在尝试在 webgl 中实现平面着色 我知道varying顶点着色器中的关键字将对该值进行插值并将其传递给片段着色器 我正在尝试禁用插值 我发现flat关键字可以做到这一点 但似乎不能在 webgl 中使用 flat varying v
  • 从 TensorArray 到 Tensor

    给定一个具有固定大小的 TensorArray 和具有统一形状的条目 我想通过将 TensorArray 的索引维度作为常规轴来获取包含相同值的 Tensor TensorArrays 有一个名为 gather 的方法 据称它应该可以做到这
  • 意外的 gcc 警告:函数返回局部变量的地址 - 这是编译器错误吗?

    以下是最小的工作示例 好吧 实际上它是最小的非工作示例 当使用 gcc 从版本 5 0 到 9 3 编译时 它会发出以下警告 它甚至似乎只在发布版本中发出警告 02及更高 Code class A class B const A getA