Меня только что укусило неприятное неопределенное поведение из-за возврата ссылки на локальную переменную.
Мы знаем, что это зло, и, как правило, компилятор печатает хороший 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]
небезопасно, но я думаю, что это может быть ужасно быстро ...