Run-Time Check Failure #2 - Stack around the variable was corrupted.



  • Guten Abend,

    heute mal etwas anders: Ich erwarte diese Art Exception, aber sie kommt nicht.

    #include <cstring>
    using namespace std;
    int main()
    {
    	{
    		char ar[10];
    		strcpy(ar,"Run-Time Check Failure #2 - Stack around the variable 'ar' was corrupted.");
    	} // Kein Run-Time Check Failure beim Verlassen des Scopes.
    }
    

    Eigentlich war ich mir ziemlich sicher, dass beim Verlassen des Scopes, bei der Freigabe des Speichers von ar , eine Exception fliegt. Das ist aber nicht der Fall, kann mir das einer erklären?

    Wohingegen hier

    #include <cstring>
    using namespace std;
    
    void fkt()
    {
    	char ar[10];
        strcpy(ar,"Run-Time Check Failure #2 - Stack around the variable 'ar' was corrupted.");
    } // Run-Time Check Failure beim Verlassen des Scopes.
    
    int main()
    {
    	fkt();
    }
    

    wie erwartet, eine Exception fliegt.

    Danke im Voraus.



  • Welche Exception soll denn kommen? Was muss ich mit catch fangen?

    beim Verlassen des Scopes

    Warum erst beim Verlassen, warum nicht bei strcpy ?

    Freigabe des Speichers von ar

    Das ist der Stack, da wird nichts "freigegeben" ...



  • Du erzeugst lupenreines UB, indem du einfach in nicht-initialisierten Speicher schreibst. Warum sollte dabei eine Exception geworfen werden?



  • knivil schrieb:

    Welche Exception soll denn kommen? Was muss ich mit catch fangen?

    beim Verlassen des Scopes

    Warum erst beim Verlassen, warum nicht bei strcpy ?

    Eine Gute Frage, kann ich die leider nicht beantworten. Als ich kurz recherchiert hatte, war meist immer zu lesen, dass erst beim Verlassen des Scopes passiert.

    knivil schrieb:

    Freigabe des Speichers von ar

    Das ist der Stack, da wird nichts "freigegeben" ...

    Sondern? Was passiert dann mit den 10Bytes?



  • Das ist einfach UB - ev. hilft Dir dein Debugger, z.B. VS mit einer Meldung.

    Edit: Oder meinst Du mit Exception sowas wie ein Seg. Fault bzw. Access Violation ?



  • theta schrieb:

    Das ist einfach UB - ev. hilft Dir dein Debugger, z.B. VS mit einer Meldung.

    Edit: Oder meinst Du mit Exception sowas wie ein Seg. Fault bzw. Access Violation ?

    Jetzt wo du es erwähnst fällt mir gerade auf, dass das gar keine Exception ist, was VS mir da an den Kopf wirft. Eine Exception wie Seg. Fault bzw. Access Violation bekommt man nicht, weil es für rohe Arrays keine Range-Überwachung gibt, oder? Bzw. Range-Überwachung kann es ja immer nur bei benutzerdefinierten Datentypen geben, da man dort den [] Operator überladen und somit eine Rang-Prüfung durchführen kann.

    Und wieso kann man beim Stack nicht von Speicherfreigabe reden?


Log in to reply