Saltar al contenido

Si una función no devuelve ningún valor, con un tipo de retorno válido, ¿está bien que el compilador devuelva basura?

Contamos con la solución a esta preocupación, al menos eso esperamos. Si sigues con preguntas puedes escribirlo en el apartado de preguntas, que sin dudar

Solución:

En C++, dicho código tiene un comportamiento indefinido:

[stmt.return]/2 … Salir del final de una función es equivalente a un retorno sin valor; esto da como resultado un comportamiento indefinido en una función de retorno de valor. …

La mayoría de los compiladores generarán una advertencia para el código similar a la de la pregunta.

El estándar C++ no requiere que esto sea un error de tiempo de compilación porque, en general, sería muy difícil determinar correctamente si el código realmente se ejecuta al final de la función, o si la función sale a través de una excepción (o un longjmp). o mecanismo similar).

Considerar

int func3() 
    func4();

Si func4() lanza, entonces este código está totalmente bien. Es posible que el compilador no pueda ver la definición de func4() (debido a la compilación separada), por lo que no puede saber si se lanzará o no.

Además, incluso si el compilador puede probar que func4() no tira, todavía tendría que probar que func3() recibe una llamada antes de que pueda rechazar legítimamente el programa. Dicho análisis requiere la inspección de todo el programa, lo que es incompatible con la compilación por separado, y que ni siquiera es posible en el caso general.

En C, citando N1256 6.9.1p12:

Si el } que finaliza una función, y el autor de la llamada utiliza el valor de la llamada de función, el comportamiento no está definido.

Así que es legal (pero una mala idea) para un no-void función para no devolver un valor, pero si lo hace y la persona que llama intenta utilizar el resultado, el comportamiento no está definido. Tenga en cuenta que no necesariamente solo devuelve un valor arbitrario; en lo que respecta al estándar, todo es posible.

Pre-ANSI C no tenía la void palabra clave, por lo que la forma de escribir una función que no devolviera un valor era omitir el tipo de retorno, haciendo que devolviera implícitamente int. Requerir un return declaración en una función de retorno de valor habría roto el código antiguo. También habría requerido un análisis adicional por parte del compilador para determinar que todos las rutas de código golpean un return declaración; dicho análisis es razonable para los compiladores modernos, pero podría haber sido una carga excesiva cuando se estandarizó C por primera vez.

C++ es un poco más estricto. En C++:

Salir del final de una función es equivalente a un devolver sin valor; esto da como resultado un comportamiento indefinido en una función de retorno de valor.

por lo tanto, el comportamiento no está definido si la persona que llama intenta usar el resultado (inexistente) o no.

Los compiladores de C y C++ ciertamente pueden advertir sobre la falta return declaraciones, o sobre rutas de control que caen al final de una función sin ejecutar un return declaración, pero las normas respectivas no les obligan a hacerlo.

En C, en realidad es legal para un no-void función para terminar sin devolver un valor, siempre que el código de llamada no intente usar el valor de retorno.

Por otro lado un return declaración sin una expresión no puede aparecer en un no-void función.

Las partes relevantes del estándar C99 son §6.9.1 para el primer caso:

Si el } que finaliza una función, y el autor de la llamada utiliza el valor de la llamada de función, el comportamiento no está definido.

y §6.8.6.4 para el segundo caso:

A return declaración sin una expresión sólo aparecerá en una función cuyo tipo de retorno es void.

Si posees algún recelo o disposición de aclararse nuestro escrito eres capaz de ejecutar una reseña y con placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *