Funktion mit fehlendem Rückgabewert, Verhalten zur Laufzeit

Lesezeit: 3 Minuten

Wie erwartet gibt der Compiler (VisualStudio 2008) eine Warnung aus

Warnung C4715: „doSomethingWith“: Nicht alle Steuerpfade geben einen Wert zurück

beim Kompilieren des folgenden Codes:

int doSomethingWith(int value)
{
    int returnValue = 3;
    bool condition = false;

    if(condition)
        // returnValue += value; // DOH

    return returnValue;
}

int main(int argc, char* argv[])
{
    int foo = 10;
    int result = doSomethingWith(foo);
    return 0;
}

Aber das Programm läuft einwandfrei. Der Rückgabewert der Funktion doSomethingWith() ist 0.

Ist nur ein undefiniertes Verhalten oder gibt es eine bestimmte Regel, wie der Ergebniswert zur Laufzeit erstellt/berechnet wird. Was passiert mit Nicht-POD-Datentypen als Rückgabewert?

  • Schauen Sie sich diese Antwort an: stackoverflow.com/questions/1610030/…

    – Fernando N.

    8. April 2010 um 7:48 Uhr

  • @fnieto: Ah, ich verstehe, das ist eine sehr gute Antwort. Habe es aber selbst nicht gefunden, bevor ich gefragt habe…

    – nabulke

    8. April 2010 um 7:52 Uhr

Benutzer-Avatar
Piotr

Es handelt sich um ein undefiniertes Verhalten, wie im Abschnitt 6.6.3 des ISO-C++-Standards angegeben:

Das Abfließen vom Ende einer Funktion ist gleichbedeutend mit einer Rückgabe ohne Wert; dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion.

  • Spezifische Formulierungen:— Das Abfließen vom Ende einer Funktion ist äquivalent zu a return ohne Wert; dies führt zu undefiniertem Verhalten in einer Wert zurückgebenden Funktion.

    – kennytm

    8. April 2010 um 7:02 Uhr


  • Die ‘main’-Funktion ist eine Ausnahme von dieser Regel. Im Nabulke-Code ist die letzte ‘Haupt’-Funktionszeile redundant.

    – Fernando N.

    8. April 2010 um 7:46 Uhr

  • Als ein wichtig Zusätzlich zu dieser Antwort heißt es in 3.6.1/5: “Wenn die Kontrolle das Ende von erreicht main ohne auf a zu stoßen return Anweisung ist die Wirkung die der Ausführung return 0;“.

    – Leichtigkeitsrennen im Orbit

    15. Juli 2011 um 14:22 Uhr

  • @LightnessRacesinOrbit: Es ist immer noch eine seltsame Praxis, es sogar in der Hauptfunktion wegzulassen, insbesondere wenn unklar ist, ob es absichtlich weggelassen wird oder nicht.

    – lpapp

    25. Dezember 2014 um 21:48 Uhr


  • @lpapp: Ich kann verstehen, warum Sie das argumentieren können, obwohl ich anderer Meinung bin: Weglassen return 0 aus main ist extrem häufig und normalerweise sehr eindeutig kein Fehler. Irgendetwas zurückgeben sondern 0 ganz am Ende des äußersten Bereichs von main wäre die seltsame Praxis !!

    – Leichtigkeitsrennen im Orbit

    25. Dezember 2014 um 23:18 Uhr


Benutzer-Avatar
Muxecoid

Bei x86-Prozessoren legt die Standard-Aufrufkonvention den Rückgabewert in das EAX-Register. Praktisch bedeutet dies, dass für die meisten Compiler das Ergebnis der letzten mathematischen Operation zurückgegeben wird, wenn wir das Ende der Funktion ohne Rückkehr erreichen. Allerdings kann man sich nicht darauf verlassen und es ist nicht tragbar.

http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

  • Interessant zu wissen! Wir hatten tatsächlich eine Funktion, der ein Return fehlte, die deswegen einen Test bestanden hat.

    – Matthieu Wipliez

    12. September 2017 um 9:53 Uhr

Benutzer-Avatar
alsether

Antwort von @piotr aktualisieren.

Von dem C++17-Standard Abschnitt 9.6.3

Abfließen des Endes eines Konstruktors, eines Destruktors oder einer Funktion mit a Lebenslauf Der Rückgabetyp void entspricht einer Rückgabe ohne Operanden. Andernfalls führt das Abfließen vom Ende einer anderen Funktion als main (6.6.1) zu undefiniertem Verhalten.

Das Zurückgeben eines Werts von einer Wert zurückgebenden Funktion führt zu undefiniertem Verhalten.

1013290cookie-checkFunktion mit fehlendem Rückgabewert, Verhalten zur Laufzeit

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy