Я только что был укушен неприятным неопределенным поведением из-за возврата ссылки на локальную переменную.
Мы знаем, что это зло, и, как правило, компилятор печатает 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]
подходит, потому что стандарт указывает, что время жизни переменной, привязанной к ссылке на константу, должно быть увеличено, чтобы соответствовать времени жизни ссылки на константу.
Строка [2]
тоже вроде в порядке...
- Покрывают ли спецификации C++ этот случай?
- Кто-нибудь знает, это обычно диагностируется? (Я могу пропустить флаг или что-то в этом роде...)
Мне кажется, что статический анализ должен быть в состоянии сказать, что использование «продления срока службы» для [1]
, [2]
небезопасно, но, я думаю, это может быстро стать безобразным...
get_env_value()
возвращает ссылку на переменную, которая не выходит за пределы области видимости, например глобальную, и в этом случае все должно быть в порядке. - person UncleBens   schedule 15.09.2010get_env_value
возвращается по копии, как это может быть ссылкой на переменную в глобальной области видимости? - person Matthieu M.   schedule 15.09.2010get_env_value
подписи все кажется правильным. - person Matthieu M.   schedule 15.09.2010