Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » CFile::Read und Unicode --> Error "run-time check failure #2"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.09.2005, 10:36 Uhr
commanderberry



Hallo,

ich lese ein Unicode Logfile mit CFile::Read aus. im alten VC6 lief alles problemlos, nur jetzt im VC7 meckert er beim Verlassen der function und sagt folgendes:

run-time check failure #2 - stack around the variable buffer was corrupted

da ich unicode auslese, habe ich den buffer auf die hälfte der auszulesenden bytes gesetzt, da ein unicode zeichen ja 2 bytes hat. ich denke es hängt irgendwie damit zusammen.. hat jemand eine idee? ich weiß echt nicht mehr weiter!
Hier mal der gesamte code:


C++:
void CCompDoc::ReadFileIntoDataStructure(CFile* pFile, CString sDisplayName, COLORREF crFontColor)
{
    DWORD                dwRead;
    const unsigned int    iBufferSize = 256;
    wchar_t                buffer[iBufferSize/2];
    wcsset(buffer,0);
    int                    len = wcslen(buffer);
    CString                sTarget;    //(buffer);
    CString tmp            ="";
    int                    crPos;

    
    LogFile *lFile = new LogFile();
    BOOL ok = TRUE;
    dwRead = pFile->Read(buffer, 2);  //liest die ersten 2 BYTES aus --> UNICODE Kennzeichen
    int counter=0;
    
    do {    
        dwRead = pFile->Read(buffer, iBufferSize);
        sTarget+= _T(buffer);
        if (dwRead<iBufferSize) {
            /*    this is only for the last read operation, where dwRead<iBufferSize
                in this case the last (unnecessary) chars will be removed
            */

            sTarget = sTarget.Left(sTarget.GetLength() - (iBufferSize - dwRead)/2);
            if (dwRead==0) //adds an additional linebreal and eof-->make sure to get last line
                sTarget = sTarget + (char(13)) + ((char)10);
        }
        do {
            while ((sTarget.GetLength()>0) && ((sTarget.GetAt(0)==13) || (sTarget.GetAt(0)==10))) {
            /*    removes the chars for value 10 or 13 (linebreak) until the
                first charvalue is unequal to (char) 10 or (char)13
            */

                sTarget.Delete(0, 1);
            }
            //    look up for linebreak
            crPos = sTarget.Find((char)13, 0);
            if (crPos!=-1) {
                //    if linebreak found add all chars until linebreak-position
                //    as a entry in current logfile
                tmp = sTarget.Mid(0, crPos);
                sTarget.Delete(0, crPos);
                if (lFile->AddEntry(tmp) == TRUE) {
                    counter++;
                }
                else {
                    AfxMessageBox("Error converting time-value in this Line:\n"
                        + tmp + "\n"
                        + "in File: "    + sDisplayName);
                }
            }
        }
        while (crPos!=-1);
    }
    while (dwRead>0);

    lFile->SetTotalEntries(counter);
    lFile->SetFileName(pFile->GetFilePath());
    lFile->SetDisplayName(sDisplayName);
    lFile->SetFontColor(crFontColor);
    lFile->SetVisible(TRUE);
    m_oaLogFiles.Add(lFile);
    m_iOpenLogFileCounter++;
    //wcsset(buffer,0);

}



Vieln Dank schonmal!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.09.2005, 10:55 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


irgendwo verständlich:


C++:
wchar_t buffer[iBufferSize/2]; // also 128 Zeichen




C++:
dwRead = pFile->Read(buffer, iBufferSize); // 256 Zeichen einlesen



d.h du schreibst über die Grenzen von buffer hinaus. -> Stack corrupted

Bei ner Release würde er da höchstwahrscheinlich mit nem RE abstürzen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.09.2005, 11:06 Uhr
commanderberry




Zitat von FloSoft:
irgendwo verständlich:


C++:
wchar_t buffer[iBufferSize/2]; // also 128 Zeichen




C++:
dwRead = pFile->Read(buffer, iBufferSize); // 256 Zeichen einlesen



d.h du schreibst über die Grenzen von buffer hinaus. -> Stack corrupted

Bei ner Release würde er da höchstwahrscheinlich mit nem RE abstürzen.


habe etwas getüftelt, der fehler muss hier liegen:

C++:
wcsset(buffer,0);


wenn ich alles andere auskommentiere aber diese zeile lasse, meckert er. lösche ich die zeile, kommt der fehler nicht mehr, aber dadurch dass wcsset nicht ausgeführt wird, schreibt er nicht richtig in den buffer rein (weniger als 128 zeichen). --> deswegen hatte ich mich so beholfen..

zu dem was du geschrieben hattest: selbst wenn ich

C++:
wchar_t buffer[iBufferSize/2]; // also 128 Zeichen



auf 256 hochsetze werden im debugger nur 128 zeichen angezeigt. liegt daran, dass unicode zeichen 2 bytes lang sind, da ich die unicode zeichen aber in ein 'unicode char array' lege, brauch das ja nur 128 zeichen lang sein... (oder? )

gruß berry
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.09.2005, 11:29 Uhr
Tommix



Hallo,
wcsset füllt den String bis zum terminierenden '\0' und weiß nichts von der Puffergröße. D.h. es schreibt immer weiter bis irgenwann mal eine 0 gefunden wird. Was Du suchst ist eher memset.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.09.2005, 14:11 Uhr
commanderberry



danke tommix,

ich habe das memset jetzt eingebaut. der neuralgische punkt war die buffergröße. da ich zeichen auslese, zum schluss aber noch die terminierende null stehen muss, muss die größe auf 129 gesetzt werden. da der compiler noch irgendwelche sonderzeichen nach dem 128. ten zeichen setzt, musste ich das 129 noch manuell auf NULL setzen.

Ich poste das mal, event. hilfts ja mal einem "googler"


C++:
    DWORD            dwRead;
    const unsigned    int    iBufferSize = 256;
    wchar_t            buffer[129];
    wmemset            (buffer,_T('*'),128);
    CString            sTarget;    //(buffer);
    CString tmp        ="";
    int                crPos;

    
    LogFile *lFile = new LogFile();
    dwRead = pFile->Read(buffer, 2);  //liest die ersten 2 BYTES aus --> UNICODE Kennzeichen
    int counter=0;
    
    do {    
        dwRead = pFile->Read(buffer, iBufferSize);
        buffer[128]=_T('\0');    //<-- SPANNEND



gruß berry
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.09.2005, 18:03 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


benutz besser


C++:
buffer[dwRead] = _T('\0');



dann terminiert er dir wirklich da wo er aufgehört hat einzulesen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.09.2005, 21:11 Uhr
~bery unangemeldet
Gast



Zitat von FloSoft:
benutz besser


C++:
buffer[dwRead] = _T('\0');



dann terminiert er dir wirklich da wo er aufgehört hat einzulesen.


stimmt! so mache ich es!

thx & greetz

berry
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: