Risolvi il controllo raggiunge la fine dell'errore di funzione non nulla in C++

Jinku Hu 12 ottobre 2023
  1. Utilizzare l’istruzione return alla fine del corpo della funzione
  2. Utilizzare le istruzioni return alla fine di ogni percorso del codice del corpo della funzione
Risolvi il controllo raggiunge la fine dell'errore di funzione non nulla in C++

Questo articolo spiegherà diversi metodi per risolvere il controllo che raggiunge la fine dell’errore di funzione non vuoto C++.

Utilizzare l’istruzione return alla fine del corpo della funzione

Le funzioni non void devono avere un tipo restituito. Di conseguenza, la funzione deve avere un’istruzione che restituisca l’oggetto del tipo corrispondente. Se vengono passati determinati flag del compilatore, questo tipo di errore o avviso potrebbe essere completamente soppresso, il che porterà a errori in fase di esecuzione se la funzione data viene chiamata nel programma.

Il seguente codice di esempio ha la funzione reverseString definita, che accetta un riferimento a una stringa e restituisce il valore della stringa. Se esaminiamo il corpo di una funzione, non esiste un’istruzione return. Anche se reverseString non passa alcun argomento alla funzione chiamante, il compilatore visualizza solo il messaggio di avviso e il programma eseguibile viene comunque compilato. Se la funzione viene chiamata, il flusso di controllo molto probabilmente porterebbe a un errore di segmentazione.

#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;
}

Utilizzare le istruzioni return alla fine di ogni percorso del codice del corpo della funzione

Un altro scenario in cui il controllo raggiunge la fine di una funzione non void è quando i blocchi condizionali non hanno le istruzioni return in ogni percorso. Quindi, se l’esecuzione nella funzione non void è ramificata e le istruzioni if non coprono ogni possibile percorso, allora ci deve essere una chiamata esplicita return alla fine del corpo della funzione.

L’esempio successivo mostra la funzione di manipolazione delle stringhe con due percorsi condizionali che passano il valore restituito alla funzione chiamante. Tuttavia, alcuni casi non vengono valutati per la condizione data, il che implica che il flusso di controllo potrebbe raggiungere la fine del blocco funzione e causare errori di runtime.

#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;
}

Probabilmente vedrai l’avviso di seguito.

Main.cpp:15:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
Autore: 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

Articolo correlato - C++ Function