Le contrôle de la résolution atteint la fin de l'erreur de fonction non vide en C++

  1. Utiliser la déclaration return à la fin du corps de la fonction
  2. Utilisez les déclarations de return à la fin de chaque chemin de code du corps de la fonction

Cet article expliquera plusieurs méthodes de résolution de l’erreur de contrôle atteint fin de fonction non nulle C++.

Utiliser la déclaration return à la fin du corps de la fonction

Les fonctions non nulles doivent avoir un type de retour. Par conséquent, la fonction doit avoir une déclaration qui renvoie l’objet du type correspondant. Si certains drapeaux du compilateur sont passés, ce type d’erreur ou d’avertissement peut être entièrement supprimé, ce qui entraînera des erreurs d’exécution si la fonction donnée est appelée dans le programme.

L’exemple de code suivant définit la fonction reverseString, qui prend une référence à une chaîne de caractères et renvoie la valeur de la chaîne. Si nous regardons dans le corps d’une fonction, il n’y a pas d’instruction return. Même si la fonction reverseString ne passe aucun argument à la fonction appelante, le compilateur n’affiche que le message d’avertissement, et le programme exécutable est quand même construit. Si la fonction est appelée, alors le flux de contrôle conduira très probablement à une erreur de segmentation.

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

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

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

Utilisez les déclarations de return à la fin de chaque chemin de code du corps de la fonction

Un autre scénario où le contrôle atteint la fin d’une fonction non nulle est lorsque les blocs conditionnels n’ont pas les déclarations return dans chaque chemin. Ainsi, si l’exécution de la fonction non vide est ramifiée et que les instructions if ne couvrent pas tous les chemins possibles, alors il doit y avoir un appel explicite au return à la fin du corps de la fonction.

L’exemple suivant montre la fonction de manipulation de chaîne de caractères avec deux chemins conditionnels qui passent la valeur de retour à la fonction appelante. Cependant, certains cas ne sont pas évalués pour la condition donnée, ce qui implique que le flux de contrôle pourrait atteindre la fin du bloc de fonction et provoquer des erreurs d’exécution.

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

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

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

Vous verrez peut-être l’avertissement ci-dessous.

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

Article connexe - C++ Function

  • Utiliser les fonctions de rappel en C++
  • Accéder aux fonctions des membres depuis un pointeur jusqu'à un vecteur en C++