Обнаружение компилятором возврата ссылки на локальную переменную

Меня только что укусило неприятное поведение undefined из-за возврата ссылки на локальный переменная.

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

5
задан Matthieu M. 15 September 2010 в 12:18
поделиться