我刚刚遇到了一个非常不好的未定义行为,原因是返回了一个对本地变量的引用。
我们知道这很危险,通常编译器会打印一个漂亮的 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]
}
这段代码可以编译通过,但是我们却陷入了不确定行为的恶劣境地。
第[1]
行没问题,因为标准规定变量绑定到const引用的生命周期应该延长到const引用的生命周期。
第[2]
行似乎也没问题...
- C++规范是否涵盖了这种情况?
- 有人知道这通常是否被诊断出来吗?(我可能漏掉了某个标志之类的东西...)
我认为静态分析应该能够告诉我们,在使用“生命周期延长”时,[1]
、[2]
不安全,但我想这可能会很棘手...
get_env_value()
返回对一个变量的引用,该变量不会超出作用域,例如全局变量,在这种情况下一切都应该没问题。 - UncleBensget_env_value
返回的是一个副本,它怎么可能是全局作用域中变量的引用呢? - Matthieu M.get_env_value
签名,一切都看起来是正确的。 - Matthieu M.