编译器检测返回对局部变量的引用

Mat*_* M. 5 c++ gcc-warning

由于返回对局部变量的引用,我刚被一个令人讨厌的未定义行为所困扰.

我们知道它是邪恶的,通常编译器打印出一个很好warning的告诉我们......好吧gcc(3.4.2)似乎并没有把检查推得太远.

std::string get_env_value(std::string const& key);

std::string const& get_phase()
{
  std::string const& phase = get_env_value("PHASE"); // [1]
  std::cout << "get_phase - " << phase << '\n';
  return phase;                                      // [2]
}
Run Code Online (Sandbox Code Playgroud)

这编译没有故障,但我们陷入了未定义行为的讨厌境界.

[1]是可以的,因为标准指定应该扩展绑定到const引用的变量的生命周期以匹配const引用的生命周期.

线[2]似乎也好......

  • C++规范是否涵盖了这种情况?
  • 有谁知道这通常被诊断出来了吗?(我可能会错过一面旗帜......)

在我看来,静态分析应该能够告诉我使用"终身扩展" [1],这[2]是不安全的,但它可能会很快变得丑陋我猜...

jal*_*alf 5

该标准不包括在内[2].它允许将rvalue绑定到const引用,但是这不允许返回const引用并且具有它被绑定扩展的rvalue的生命周期.

真实的,静态分析可以捕捉到这一点,但一如既往地是一种权衡.C++编译本身就足够慢,因此编译器编写者必须权衡进一步静态分析的好处,这可能使他们能够针对增加的编译时间产生更好的诊断.