case innerhalb case-block



  • Hi Leute

    wir hatten letztens ein Problem durch ein fälschlich eingefügtes 'case'.
    Der Compiler hat das sauber ohne Warnungen kompiliert und so ist es dann zumindest bis in die Testumgebung gekommen.

    Sinngemäß war es sowas ( vereinfacht ):

    int x = 2;
    switch ( x )
    {
        case 1 : std::cout << "1" << std::endl; break;
        case 2 :
        {
            std::cout << "2" << std::endl;
            case 3 :
            {
                std::cout << "3" << std::endl;
                return 0;
            }
            break;
        }
        default : break;
    }
    

    Die Ausabe ist in dem Fall:
    2
    3

    Mir stellt sich nun die Frage, warum der Compiler sowas nicht bemängelt? Gibt es eine sinnvolle Anwendung für solch ein Szenario? Das überschüssige 'case' wird einfach ignoriert und das damit assoziierte Kommando wird ausgeführt. In unserem Fall war das ein schlimmes MemoryLeak 😃

    CppCheck erkennt sowas übrigens auch nicht.

    Warum geht sowas durch?
    Wie kann man sowas in Zukunft verhindern?



  • Das ist doch ein einfaches "Durchfallen" in den nächsten Zweig. Und da dies in den meisten Fällen gewollt ist, gibt es eben keine Warnung.
    Für einen praktischen (wenn auch heute wohl überholten) Anwendungsfall siehe bspw. "Duff's device".



  • Naja aber das "case" wird einfach ignoriert, aber das Kommando dennoch ausgeführt... das finde ich irgendwie ein wenig krank.



  • It0101 schrieb:

    Naja aber das "case" wird einfach ignoriert, aber das Kommando dennoch ausgeführt.

    Ein case ist nichts weiter als eine Sprungmarke für das switch.



  • It0101 schrieb:

    Naja aber das "case" wird einfach ignoriert, aber das Kommando dennoch ausgeführt... das finde ich irgendwie ein wenig krank.

    Nö, es wird nicht ignoriert. Setze oben doch mal x=3 ein. Dann siehst du, dass es sehr wohl angesprungen wird.



  • Naja gut. Ich finde mich damit ab, dass das eben zulässig ist. Schade. 😉

    Für allen möglichen Kram kriegt man "outdated" um die Ohren gehauen, aber so ein Kram, der vor 35 Jahren mal nützlich war, wird nicht "entsorgt". Zumal der Code von Duffs-Device nicht gerade intuitiv ist... Muss man auch dreimal hingucken um es einmal zu raffen 😉



  • Ja, ich fände auch dass da ein paar mehr Warnings möglich wären. Findet man halt dummerweise in haufenweise C Code, so dass die Warning vermutlich jeder abdrehen würde. Und dann bringt sich auch wieder nix.



  • Zumindest die C++-Compiler sollten das als optionale Warnungskategorie unterstützen.



  • It0101 schrieb:

    Zumindest die C++-Compiler sollten das als optionale Warnungskategorie unterstützen.

    -Wimplicit-fallthrough


Log in to reply