Was bedeutet “CRT hat festgestellt, dass die Anwendung nach dem Ende des Heap-Puffers in den Speicher geschrieben hat”?

Lesezeit: 3 Minuten

Benutzeravatar von user3699827
Benutzer3699827

Ich habe Probleme mit diesem Code. Es bricht bei der Funktion free(q->izv) ab und ich erhalte einen Debug-Fehler, der besagt:

CRT detected that the application wrote to memory after end of heap buffer

Ich habe keine Ahnung, was das bedeutet, also wäre ich dankbar für jede Hilfe, die ich bekomme.

    typedef struct izvodjaci{
        char *izv;
        int broj;
        struct izvodjaci *sled;
    }IZV;

    obrisi_i(IZV *p){
        while (p){
            IZV *q;
            q = p;
            p = p->sled;
            if (!strcmp(q->izv,"UNKNOWN")) free(q->izv);
            free(q);
        }
    }

Danke im Voraus

  • Es besteht die Möglichkeit, dass der Pufferüberlauf nur dort erkannt wird und nicht dort, wo er tatsächlich auftritt. Versuchen Sie, Ihren gesamten Code auf ein kleines Beispiel zu reduzieren, das das Problem repliziert, und posten Sie es hier, vorausgesetzt, Sie finden das Problem nicht zuerst.

    – ev

    4. Juni 2014 um 14:14 Uhr

Benutzeravatar von Eric Lippert
Erich Lippert

Was bedeutet „CRT hat festgestellt, dass die Anwendung nach dem Ende des Heap-Puffers in den Speicher geschrieben hat“?

Angenommen, Sie weisen einen Heap-Puffer zu:

char* buffer = malloc(5);

OK, buffer zeigt jetzt auf fünf Zeichen auf dem Haufen.

Angenommen, Sie schreiben sechs Zeichen in diesen Puffer:

buffer[0] = 'a';
buffer[1] = 'b';
buffer[2] = 'c';
buffer[3] = 'd';
buffer[4] = 'e';
buffer[5] = '\0';

Sie haben jetzt den Haufen verdorben; du durftest nur fünf zeichen schreiben und hast sechs geschrieben.

Das Programm darf es jetzt tun irgendetwas. Es kann normal funktionieren, es kann abstürzen, es kann alle Ihre Passwörter an Hacker in China senden, irgendetwas.

Ihre Implementierung wählt anscheinend die bestmögliche Option aus, nämlich “Sie darüber informieren, dass Sie einen Fehler gemacht haben”. Du solltest sein sehr sehr glücklich dass dies passiert ist, anstatt einer der schrecklichen Alternativen. Leider informiert es Sie wenn der Puffer freigegeben wirdund nicht als du den Fehler gemacht hastaber sei froh, dass du überhaupt einen Fehler bekommen hast.

  • Vielen Dank. Du hattest Recht. Ich habe mich verrechnet und einen Platz mehr verwendet, als ich zugewiesen habe.

    – Benutzer3699827

    5. Juni 2014 um 9:56 Uhr

  • Ich habe fast alles umgeschrieben, außer das … Dies ist das erste Mal, dass ich diesen Fehler gemacht habe, also habe ich diese Fehlermeldung noch nie gesehen, also geriet ich irgendwie in Panik. Und danke für die Tipps.

    – Benutzer3699827

    5. Juni 2014 um 10:05 Uhr


  • Hallo Eric, das war unglaublich. Ich habe irgendwie strlen beim Kopieren von src char* nach dest char* verwendet. Können Sie mir sagen, warum der Visual Studio-Compiler dieses Korruptionsproblem im kostenlosen Modus findet, anstatt während ich am Ende über die Speichergrenzen hinaus geschrieben habe?

    – Saurabhöhen

    22. April 2015 um 19:31 Uhr

  • @user1874627: Dies ist eine Frage-und-Antwort-Site für spezifische Fragen zum tatsächlichen Code, und was Sie dort haben, ist eine spezifische Frage zum tatsächlichen Code, daher empfehle ich Ihnen, (1) zu suchen, um zu sehen, ob sie bereits beantwortet wurde , und wenn nicht (2) eine Frage posten!

    – Eric Lippert

    22. April 2015 um 20:40 Uhr

  • @user1874627: Wenn Sie Probleme beim Einstieg haben, finden Sie hier ein einfacheres Problem. Angenommen, Sie generieren Code zur Erkennung von Out-of-Bounds-Schreibvorgängen auf einen beliebigen Offset in einem Speicherpuffer. aber Sie wissen, dass der Offset vom Beginn des Puffers an ist. Wie würden Sie in diesem Fall die Out-of-Bounds-on-Write-Erkennung schreiben? Beide Probleme sind lösbar, aber dieses ist viel einfacher.

    – Eric Lippert

    22. April 2015 um 20:48 Uhr

1433170cookie-checkWas bedeutet “CRT hat festgestellt, dass die Anwendung nach dem Ende des Heap-Puffers in den Speicher geschrieben hat”?

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

Privacy policy