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



  • Hat jemand schon mal diese Meldung gehabt ?
    Was kann mir denn da den Stack zerschossen haben ?



  • Unter anderem der Zugriff auf ungültige Adressen wie z.B. jenseits der Arraygrenzen.

    Zeig mal den betreffenden Code (im Debugger wirst du an die Stelle geführt, bei der die Meldung kommt).



  • Thule schrieb:

    Was kann mir denn da den Stack zerschossen haben ?

    Dein Programm.



  • 0o0o0o00o schrieb:

    Thule schrieb:

    Was kann mir denn da den Stack zerschossen haben ?

    Dein Programm.

    noch genauer: der teil deines programms, den du selbst geschrieben hast - zumindest ist das der kaputte teil - vll hat dann auch ne (falsch benutzte) fremde fkt alles kaputt gemacht^^

    bb



  • das mein Programm dran schuld ist war mir klar 🙂
    Sorry für die blöde Fragestellung.
    Ich hatte auf dem Stack eine Variable angelegt mit char cBuffer[255];
    Nachdem ich diese mit static char cBuffer[255] in den Heap gelegt habe scheint´s zu klappen. War das Array zu gross für den Stack ?

    Wenn ich aber mit
    char* cBuffer;
    cBuffer = new char[255];
    und
    delete []cBuffer arbeite, kommt es ab und zu vor dass der Heap zerschossen wird.

    Irgendwie seltsam......



  • [quote="Thule"] War das Array zu gross für den Stack ?[/cpp] ziemlich sicher nicht. Platz für 255 Byte sollte schon sein.

    Wenn ich aber mit
    char* cBuffer;
    cBuffer = new char[255];
    und
    delete []cBuffer arbeite, kommt es ab und zu vor dass der Heap zerschossen wird.

    Irgendwie seltsam......

    Wenn der buffer auf dem stack den stack zerschießt und der buffer auf dem heap den heap zerschießt, dann liegts wohl an der Benutzung des buffers. Wenn du da mit irgendwelchen C-strings drin hantierst muss dir bewusst sein, dass in den buffer nur 255 Zeicken inklusive des \0-Delimiters reinpassen. Wenn du also einen C-String mit 255 Zeichen hast wird der delimiter ggf. dahinter geschrieben - was dann einen entsprechenden Zugriffsfehler ergibt.
    Spricht was dagegen einen std:.string zu benutzen oder einen std::vector<char>? die sichern sich nämlich gegen solche Missetaten weitgehend ab.



  • das Problem ist nur folgendes: Ich benutze cBuffer um Zeichen von der serielle Schnittstelle einzulesen. Allerdings ist das Einlesen auf 100 Zeichen begrenzt.
    Und deshalb weiss ich nciht wo ich noch suchen soll ........



  • Thule schrieb:

    das Problem ist nur folgendes: Ich benutze cBuffer um Zeichen von der serielle Schnittstelle einzulesen. Allerdings ist das Einlesen auf 100 Zeichen begrenzt.
    Und deshalb weiss ich nciht wo ich noch suchen soll ........

    Zeig am besten mal deinen Code, dann sehen wir weiter. Irgendwas machst du ja schließlich falsch, und das wird sich schon finden lassen.



  • void CLoader::ReadVoltage()
    {
    char cBuffer1[50];
    char cBuffer[255];
    int nResult;

    switch (m_Type)
    {
    case TYPE1::
    cBuffer1[0]= STX;
    cBuffer1[11]= ETX;
    cBuffer1[12]= '\0';
    strncpy(cBuffer1+1,"MEAS:UOUT?",10);
    nResult = m_pPort->SendCmdWithAnswer(cBuffer1, cBuffer,12,
    m_uTimeout,sizeof(cBuffer)-1);
    if (!nResult)
    m_fVoltage = atof(cBuffer);
    else
    m_fVoltage = -1.0;
    break;
    /*
    case TYPE2:
    strcpy (cBuffer1, "*LSS?");
    cBuffer1[5] = 13;
    cBuffer1[6] = '\0';
    nResult = m_pPort->SendCmdWithAnswer(cBuffer1, cBuffer, 6, m_uTimeout);
    if (!nResult)
    m_fVoltage = ((atof(cBuffer+3))/1000);
    else
    m_fVoltage = -1.0;
    break;
    */
    }
    }



  • 1. Wär gut, wenn du ein wenig mehr relevanten Codee zeigen würdest. Die Funktion SendCmdWithAnswer scheint mir spontan die einzige mögliche Fehlerursache zu sein, weil nur sie cBuffer beschreibt. Kannst du die auch mal posten?

    2. Was passiert, wenn du cBuffer größer machst? Setz es mal auf 4096 oder so, gibts dann auch noch nen Fehler?

    3. Was soll "case TYPE1::"?? Du hast doch keinen doppelten Doppelpunkt im Code stehen, oder? Hast du das etwa abgetippt? Code sollte man immer copypasten, um Tippfehler zu vermeiden.

    4. Bitte benutze cpp-Tags, dann wird der Code schön formatiert und ist auch deutlich lesbarer.



  • 1. Vermute ich auch, aber die gehört zu einer gekauften Bibliothe, ich habe also keinen Source davon.

    2. Muß ich mal teste

    3. Hast natürlich recht, aber ich habe die Begriffe TYPE1 und TYPE2 (obwohl eh kommentiert) ausgetauscht

    4. ich habe DEFINITIV Codeeinrückungen vorgenommen, aber irgendwie sind die verschwunden



  • Thule schrieb:

    4. ich habe DEFINITIV Codeeinrückungen vorgenommen, aber irgendwie sind die verschwunden

    Wie kann man sich C++ Programmierer nennen, wenn man nicht mal weiß, wie html funktioniert?
    deshalb gibt es ja auch die cpp-tags. du könntest sie so gar benutzen und es wäre nicht nur genau so eingerückt, wie du es hast sondern es würde auch den code an sich leserlicher machen(syntax-highlighting)

    bb



  • Thule schrieb:

    Ich benutze cBuffer um Zeichen von der serielle Schnittstelle einzulesen. Allerdings ist das Einlesen auf 100 Zeichen begrenzt.

    Wo gibst du das denn überhaupt an? Ich kann da nix passendes sehen.

    Haste die Lösung mittlerweile gefunden?



  • C++ und Html unabhängig voneinander sind und nicht aufeinander angewiesen sind ?



  • Thule schrieb:

    C++ und Html unabhängig voneinander sind und nicht aufeinander angewiesen sind ?

    Zu deinem Nebensatz ein Hauptsatz und ein überleitendes Wort fehlen?



  • Thule schrieb:

    C++ und Html unabhängig voneinander sind und nicht aufeinander angewiesen sind ?

    aber zum c++ verständnis gehört auch grundlegende pc-kenntnisse. und dazu gehört eben ein wenig mehr, als zu wissen, wo das keyboard liegt, wie der monitor an geht und die telefonnr. des technikers zu wissen...
    und ich denke, dass man mit dazuzählen kann, zu wissen, dass bei html ein leerzeichen genau so ausgegeben wird wie 999999 davon nacheinander(und nach nem zeilenumbruch - bzw allg. nach nem nicht darstellbaren zeichen alle whitespace-chars ignoriert werden).
    nun ja - poste halt noch mal deine fkt(mit cpp tags) und die deklaration der Fkt. "SendCmdWithAnswer" und nen Link zur evtl. vorhandenen Doku bzw den Kommentaren über der Fkt

    bb



  • 1. Bitte auch die Betreffzeile mitlesen, und nicht nur einen Teile der Nachricht
    2. Wie gesagt, es handelt sich um eine fertige Bibliothek, und das Leselimit wird vorher schon mit einer anderen Funktion gesetzt
    3. Wie bereits viel weiter oben erwähnt, es funktioniert wenn ich schreibe:

    static char cBuffer[255];
    
    anstelle von
    char* cBuffer;
    cBuffer = new char[255];
    ...
    ...
    ...
    delete [] cBuffer;
    


  • Ich behaupte durchaus, dass ich PC-Kentnisse habe, und die reichen sogar sehr weit zurück. Ich denke mal dass Du wiederum mit Begriffen wie Daisy-Chain und 8059 (ein Baustein, der früher als Interrupt-Controller im PC eingesetzt war) weniger etwas anfangen kannst. Ich bin mit dem PC sozusagen groß geworden, aber glücklicherweise noch ohne Windows. Ich habe bereits unter MS-DOS Software entwickelt, die sich in den berühmten Keyboard-Interrupt eingehängt hat (1Ch), der 18,2 mal pro Sekunde aufgerufen wurde und habe dadurch unter MS-DOS eine serielle Kommunikation im Hintergrund ablaufen lassen (Mischungs aus C und Assembler).
    Heute entwickle ich fast ausschließlich Software für Microcontroller, falls Dir das was sagt. Da gibt es nicht mal ein Betriebssystem.
    Und alles in allem kam ich bis heute sehr gut ohne HTML-Kenntnisse zurecht.
    Mag ja sein, dass es üblich ist hier die Code-Snippets entsprechend zu formatieren. Da ich aber meine Probleme meistens selbst löse, bin ich sehr selten in solchen Foren zu finden.
    Aber deswegen lasse ich mich nicht für doof erklären, sorry.



  • Thule schrieb:

    3. Wie bereits viel weiter oben erwähnt, es funktioniert wenn ich schreibe:

    static char cBuffer[255];
    
    anstelle von
    char* cBuffer;
    cBuffer = new char[255];
    ...
    ...
    ...
    delete [] cBuffer;
    

    Das heisst nichts. Undefiniertes Verhalten != Absturz.

    Wenn Du auf Deinem Microcontroller in irgendeinen freien Bereich im RAM ein paar Bytes zuviel übernagelst, passiert ja auch etwas anderes als wenn Du Dir auf dem Stack ein paar Verwaltungsinformationen oder die Rücksprungadresse oder sonstwas überschreibst.



  • Das stimmt schon,

    aber sowohl die Variante
    static char cBuffer[255];

    als auch die Variante mit

    new
    

    und

    delete
    

    legen mir cBuffer in den Heap.



  • Eigentlich landet ein static array im globalen Datenbereich des Programms. Nicht im Heap.


Anmelden zum Antworten