Me acaba de picar un comportamiento indefinido desagradable debido a la devolución de una referencia a una variable local.Detección del compilador de la referencia de devolución a la variable local
Sabemos que es malo, y en general el compilador imprime un buen warning
para decirnos ... bueno, gcc (3.4.2) no parece llevar los controles demasiado lejos.
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]
}
Se compila sin problemas y, sin embargo, caemos en el asqueroso reino del comportamiento indefinido.
La línea [1]
está bien porque el estándar especifica que la duración de una variable vinculada a una referencia constante debe extenderse para coincidir con el tiempo de vida de la referencia constante.
Línea [2]
parece bien también ...
- No especificaciones del C++ cubren este caso?
- ¿Alguien sabe si esto generalmente se diagnostica? (I puede pasar por alto una bandera o algo ...)
Me parece que el análisis estático debe ser capaz de decir que tiene usar una "extensión de vida" para [1]
, [2]
no es seguro, pero podría conseguir feo rápidamente, supongo ...
¡Maldición, es un caso desagradable! –
Eventualmente es posible que 'get_env_value()' devuelva una referencia a una variable que no está fuera del alcance, por ejemplo, global, en cuyo caso todo debería estar bien. – UncleBens
@UncleBens: ese es un buen punto – Chubsdad