C++ 意外的gcc警告:函数返回局部变量的地址-是编译器错误吗?
下面是最小的工作示例(好的,事实上这是最小的非工作示例:-))。当使用gcc(从5.0版到9.3版)编译时,它会触发以下警告。它甚至似乎只在发布版本中发出警告(C++ 意外的gcc警告:函数返回局部变量的地址-是编译器错误吗?,c++,gcc,gcc-warning,compiler-bug,C++,Gcc,Gcc Warning,Compiler Bug,下面是最小的工作示例(好的,事实上这是最小的非工作示例:-))。当使用gcc(从5.0版到9.3版)编译时,它会触发以下警告。它甚至似乎只在发布版本中发出警告(-02及更高版本) 代码: class A { }; class B { const A& getA() const { static A a; return a; } const A& get(bool b) const; }; const A&
-02
及更高版本)
代码:
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
A类
{
};
B类
{
常量A&getA()常量
{
静态A;
返回a;
}
常量A和获取(布尔b)常量;
};
常量A&B::获取(布尔B)常量
{
返回静态_cast(b?getA():getA());
}
int main(int argc,字符**argv)
{
返回0;
}
编译器输出:
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
:在成员函数“const A&B::get(bool)const”中:
:17:50:警告:函数返回局部变量[-Wreturn local addr]的地址
返回静态_cast(b?getA():getA());
:17:50:注:此处声明
返回静态_cast(b?getA():getA());
编译器返回:0
上面的代码可以用MSVC和clang编译,甚至可以用GCC10.1编译。它还使用较旧的gcc版本编译调试中的ok(使用-O1
或-O0
)
你能看到代码中有什么不正确的地方吗?或者这真的是编译器的问题吗
观察
当我将一个已删除的复制构造函数添加到类a(a(const a&)=delete;
)时,警告消失,编译器停止创建局部变量
试试看
你可以试试为什么使用GCC来C++?@ DaviG.PikETT为什么不呢?看起来这是假阳性警告。看起来它已经在gcc 10中修复了。@eerorika这不是误报,如果您查看生成的代码,它是不正确的。即使使用<代码> -O0<代码>,生成的代码也返回无效引用。如果删除<代码> STATICORCAST 它似乎具有预期的行为。为什么使用GCC来C++?@ DavID.PkeTeT为什么不呢?看起来这是假阳性警告。看起来它已经在gcc 10中修复了。@eerorika这不是误报,如果您查看生成的代码,它是不正确的。即使使用
-O0
生成的代码也会返回一个无效的引用。如果删除静态\u cast
,它似乎具有预期的行为。