Heftige Reaktion bei kleinem Schnitzer...



  • Wo issen jetzt der Fehler genau?



  • Das dürfte doch gar nicht kompilieren ohne return. WTF.



  • Es wird "nur" gewarnt.





  • void return schrieb:

    Das dürfte doch gar nicht kompilieren ohne return. WTF.

    Doch. Es ist nur UB.

    N3337 §6.6.3/2 schrieb:

    Flowing off the end of a function is equivalent to a return with no value; this results in undefined
    behavior in a value-returning function.



  • Tim06TR schrieb:

    Es wird "nur" gewarnt.

    Jo, schließlich ist das Programm nicht ill-formed...



  • Haben die das in C++11 immer noch nicht gefixt?



  • c++ölf schrieb:

    Haben die das in C++11 immer noch nicht gefixt?

    Siehst du doch. Und ich glaube, das kommt auch nicht im C++14 Std...



  • macht es denn irgendeinen sinn das das nicht zum compilerfehler führt?



  • 😕 Wenn ich den gezeigten Quellcode in MSVC 2012 ausführe bekomme ich:

    1 Error: error C4716: 'run_comparison_script' : must return a value
    1 Warning: warning C4100: 'script' : unreferenced formal parameter

    Was verwendet ihr den für einen Compiler?



  • GCC.



  • Sone schrieb:

    GCC.

    Dann mal +1 für MSVC 😃



  • War ja klar...Billigcompiler.



  • out schrieb:

    Sone schrieb:

    GCC.

    Dann mal +1 für MSVC 😃

    Lol. Dafür das er mit dem Standard inkompatibel ist? 👎

    GCC tut nur seine Pflicht :p



  • Darf ein Compiler nur als Fehler auslegen, was tatsächlich durch den Standard untersagt ist?



  • Wenn ich mich nicht taeusche, darf nur einen Fehler ausgeben, was wirklich ill-formed ist. Das Programm ist ja Standard-Konform, wenn auch mit undefiniertem Verhalten, also muss es kompilieren. Warnen dagegen darf ein Compiler so viel er will.

    In der Hinsicht hat MSVC hier wirklich einen Bug:

    #include <iostream>
    
    void foo()
    {
    	int i;
    	i = (++i)*(--i)%60;
    	std::cout << i;
    }
    
    int bar()
    {
    	int i;
    	i = (++i)*(--i)%60;
    	return i;
    }
    
    int retNoValue1()
    {}
    
    int retNoValue2()
    {
    	foo();
    }
    
    int retNoValue3()
    {
    	if(bar() % 8)
    	{
    		return 0;
    	}
    }
    
    int main()
    {
    	retNoValue1();
    	retNoValue2();
    	retNoValue3();
    }
    
    1>------ Erstellen gestartet: Projekt: Test, Konfiguration: Debug Win32 ------
    1>Der Buildvorgang wurde am 28.10.2012 09:48:03 gestartet.
    1>InitializeBuildStatus:
    1>  Aktualisieren des Timestamps von "Debug\Test.unsuccessfulbuild".
    1>ClCompile:
    1>  main.cpp
    1>p:\tmp\test\main.cpp(6): warning C4700: Die nicht initialisierte lokale Variable "i" wurde verwendet.
    1>p:\tmp\test\main.cpp(13): warning C4700: Die nicht initialisierte lokale Variable "i" wurde verwendet.
    1>p:\tmp\test\main.cpp(18): error C4716: 'retNoValue1': Muss einen Wert zurückgeben
    1>p:\tmp\test\main.cpp(23): error C4716: 'retNoValue2': Muss einen Wert zurückgeben
    1>p:\tmp\test\main.cpp(31): warning C4715: "retNoValue3": Nicht alle Steuerelementpfade geben einen Wert zurück.
    1>
    1>Fehler beim Erstellen
    1>
    1>Verstrichene Zeit 00:00:00.79
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Bei den uninitialisierten Variablen warnt er erwartungsgemaess, auch bei retNoValue3 warnt er richtig. Aber bei retNoValue1 und retNoValue2 ist der Fehler falsch, weil das trotzdem nicht ill-formed ist.
    Getestet auf MSVC 2010 Professional, deaktivieren der MS-Spracherweiterungen macht keinen Unterschied. VS2012 kann ich grad nicht benutzten, weil mir gestern durch einen Stromausfall eine Platte abgeraucht ist (nach nicht mal 48 h Betrieb, hatte meinen PC gerade vom aufruesten wieder :(). Koennt das mal jemand anderes testen, obs da richtig geht?



  • Ich finde es aber ehrlich gesagt angemessen, dass er nicht kompiliert. Es gibt doch wirklich keinen Fall, wo das sinnvoll sein könnte.



  • Natuerlich waere es absolut nicht sinnvoll, wuerde es kompilieren. Tatsache ist aber, dass das Programm nicht ill-formed ist, weshalb der Compiler C4716 eigentlich genauso als Warnung behandlen muesste wie C4715. Ob ich dann 'Warnungen wie Fehler behandeln' anschalte ist meine Sache.


  • Mod

    Eisflamme schrieb:

    Ich finde es aber ehrlich gesagt angemessen, dass er nicht kompiliert. Es gibt doch wirklich keinen Fall, wo das sinnvoll sein könnte.

    int foo(int x)
    {
     if (x>0) return 1;
     if (x<0) return 0;
    }
    

    Fehler? Warnung? Korrektes Programm?

    void foobar()
    {
     exit(0);
    }
    
    int bar()
    {
     foobar();
    }
    

    Fehler? Warnung? Korrektes Programm?



  • SeppJ schrieb:

    int foo(int x)
    {
     if (x>0) return 1;
     if (x<0) return 0;
    }
    

    Fehler? Warnung? Korrektes Programm?

    warning C4715: 'foo' : not all control paths return a value

    SeppJ schrieb:

    void foobar()
    {
     exit(0);
    }
    
    int bar()
    {
     foobar();
    }
    

    Fehler? Warnung? Korrektes Programm?

    error C4716: 'bar' : must return a value


Anmelden zum Antworten