Resolver el control llega al final del error de la función no vacía en C++

Jinku Hu 12 octubre 2023
  1. Usar la declaración return al final del cuerpo de la función
  2. Use las declaraciones de return al final de cada ruta de código del cuerpo de la función
Resolver el control llega al final del error de la función no vacía en C++

Este artículo explicará varios métodos para resolver el control llega al final de la función de error no evitable C++.

Usar la declaración return al final del cuerpo de la función

Las funciones no evasivas se requieren para tener un tipo de retorno. Por consiguiente, la función necesita tener una declaración que devuelva el objeto del tipo correspondiente. Si se pasan ciertos flags del compilador, este tipo de error o advertencia podría ser suprimido por completo, lo que provocará fallos en tiempo de ejecución si la función dada es llamada en el programa.

El siguiente código de ejemplo tiene definida la función reverseString, que toma una referencia a una cadena y devuelve el valor de la misma. Si miramos en el cuerpo de una función, no hay ninguna declaración return. Aunque la reverseString no pasa ningún argumento a la función llamadora, el compilador sólo muestra el mensaje de advertencia, y el programa ejecutable se construye de todas formas. Si se llama a la función, entonces el flujo de control probablemente llevará a un fallo de segmentación.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

string reverseString(string &s) { string rev(s.rbegin(), s.rend()); }

int main() {
  string str = "This string is arbitrary";
  int cond = -1;

  cout << str << endl;
  cout << reverseString(str, cond) << endl;

  return EXIT_SUCCESS;
}

Use las declaraciones de return al final de cada ruta de código del cuerpo de la función

Otro escenario en el que el control llega al final de una función no evasiva es cuando los bloques condicionales no tienen las declaraciones de return en cada camino. Por lo tanto, si la ejecución en la función no evasiva se ramifica y las declaraciones if no cubren todos los caminos posibles, entonces debe haber una llamada explícita de return al final del cuerpo de la función.

El siguiente ejemplo demuestra la función de manipulación de cadenas con dos caminos condicionales que pasan el valor de retorno a la función llamadora. Sin embargo, algunos casos se dejan sin evaluar para la condición dada, lo que implica que el flujo de control podría llegar al final del bloque de la función y causar errores en tiempo de ejecución.

#include <algorithm>
#include <iostream>
#include <iterator>

using std::cout;
using std::endl;
using std::reverse;
using std::string;

string reverseString(string &s, int condition) {
  if (condition == -1) {
    string rev(s.rbegin(), s.rend());
    return s;
  } else if (condition == 0) {
    return s;
  }
}

int main() {
  string str = "This string is arbitrary";
  int cond = -1;

  cout << str << endl;
  cout << reverseString(str, cond) << endl;

  return EXIT_SUCCESS;
}

Es posible que vea la advertencia que figura a continuación.

Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Function