Warnung "control reaches end of non-void function"



  • #include <iostream>
    
    struct A
    {
      int a;
      A() : a(0) { }
    };
    
    A f()
    { }
    
    int main()
    {
      std::cout << f().a << std::endl;
    }
    

    Dieses Programm compiliert mit gcc 3.3.5 und 4.0.2 mit der Warnung "control reaches end of non-void function", auch mit "-Wall -pedantic". Kann mir jemand erklären, warum das kein Fehler ist?

    Tommi



  • Du solltest die Warnung trotzdem beachten - und f() eine return-Anweisung spendieren.

    (warum der Compiler das nicht als Fehler ankreidet, müsstest du ihn schon selber fragen)



  • Ich verstehe aber seine Antwort nicht:

    tommi@nurmi:~/tmp> g++ -o ttt -Wall -pedantic ttt.cpp
    ttt.cpp: In function ‘A f()’:
    ttt.cpp:10: warning: control reaches end of non-void function
    tommi@nurmi:~/tmp> echo "Warum war das kein Fehler?"|g++
    g++: no input files
    tommi@nurmi:~/tmp>
    

    🤡



  • Vermutung:

    Heisst pedantic vielleicht nur, daß er ALLES anmeckert, aber nicht alles als Fehler ankreidet?

    Ich kenn den GCC nicht so im Detail 😉



  • tntnet schrieb:

    Kann mir jemand erklären, warum das kein Fehler ist?

    IIRC verbietet der Standard sowas nicht, sondern weist das als undefiniertes Verhalten aus.



  • Der Grund wieso der Compiler sowas generel nicht als Fehler anmeckert ist weil er in manchen Situationen nicht zweifelsfrei feststellen kann ob es ein Fehler ist. Beispiel:

    int foo(){
      switch(bar()){
        case 0:return 1;
        case 2:return 3;
        case 3:return 4;
      }
    }
    

    Fals der Rückgabewert von bar immer 0,2 oder 3 ist der Code korrekt ansonsten falsch. Dann gibt es auch noch Fälle wie diesen:

    int void foo(int c){
      assert(c != 4);
      if(c < 4)
        return 5;
      else if(c > 4)
        return 8;
    }
    

    Wo es zwar möglich ist herzuleiten, dass es keinen Fehler ist, aber für einen Compiler nicht ganz trivial.

    Aus diesem Grund weißt der GCC immer nur auf potenzielle Fehler hin.



  • tntnet schrieb:

    Ich verstehe aber seine Antwort nicht:

    tommi@nurmi:~/tmp> g++ -o ttt -Wall -pedantic ttt.cpp
    ttt.cpp: In function ‘A f()’:
    ttt.cpp:10: warning: control reaches end of non-void function
    tommi@nurmi:~/tmp> echo "Warum war das kein Fehler?"|g++
    g++: no input files
    tommi@nurmi:~/tmp>
    

    🤡

    😃 🤡 😃
    Also sowas habe ich auch noch nie probiert 😉

    (ernsthaft: Sagt dir der Begriff "Manuals" oder "Hilfedatei" etwas?


Anmelden zum Antworten