basic_fstream<wchar_t> open() Zeigerüberlauf



  • Hallo zusammen

    Ich habe folgenden Code:

    std::basic_fstream<wchar_t> file;
    file.open(sMainLogFile.c_str(), std::ios_base::out | std::ios_base::binary | std::ios_base::app); // <<< Zeile 223
    

    sMainLogFile ist ein String.

    Sobald dieser Code mit Codeguard ausgeführt wird, bekomme ich einen Zeigerüberlauf.

    Fehler 00051. 0x130410 (Thread 0x119C):
    Zugriff Überlauf: Versuch auf 520 Byte(s) bei 0x00CBC67C zuzugreifen, das ist
     bei Offset 12 in Heap block 0x00CBC670, der nur 150 Byte lang ist.
    wcstombs(0x013BFA58 ["áÐ\f"], 0x00CBC67C, 0x104 [260]) 
    
    Aufrufhierarchie:
       0x005302A2(=ES720Ctrl.exe:0x01:12F2A2)
       0x0041A49F(=ES720Ctrl.exe:0x01:01949F) d:\program files\embarcadero\rad studio\7.0\include\dinkumware\fstream#157
       0x004198E8(=ES720Ctrl.exe:0x01:0188E8) d:\program files\embarcadero\rad studio\7.0\include\dinkumware\fstream#933
       0x004177CB(=ES720Ctrl.exe:0x01:0167CB) ..\..\lib\LogClass.cpp#223
       0x004172DF(=ES720Ctrl.exe:0x01:0162DF) ..\..\lib\LogClass.cpp#190
       0x0040410A(=ES720Ctrl.exe:0x01:00310A) ..\..\lib\KcTcpServerThread.cpp#213
    
    Speicherblock (0x00CBC670) [Größe: 150 Byte] war Bereitgestellt mit
     SysGetMem
    Aufrufhierarchie:
       0x00475E7A(=ES720Ctrl.exe:0x01:074E7A)
       0x00416759(=ES720Ctrl.exe:0x01:015759) ..\..\lib\LogClass.cpp#37
       0x00403368(=ES720Ctrl.exe:0x01:002368) ..\..\lib\KcTcpServerThread.cpp#50
       0x0040E898(=ES720Ctrl.exe:0x01:00D898) ..\ES720_Test\TcpServerES720Thread.cpp#53
       0x004127C2(=ES720Ctrl.exe:0x01:0117C2) fMainCtrl.cpp#134
       0x004BA813(=ES720Ctrl.exe:0x01:0B9813)
    
    ------------------------------------------
    

    In fstream steht folgendes:

    _Myt *open(const wchar_t *_Filename,
    		ios_base::openmode _Mode,
    		int _Prot = (int)ios_base::_Openprot)
    		{	// open a wide-named C stream -- EXTENSION
    		_Filet *_File;
    		if (_Myfile != 0 || (_File = _Fiopen(_Filename, _Mode, _Prot)) == 0) // <<< Zeile 157
    			return (0);	// open failed
    
    		_Init(_File, _Openfl);
    		_Initcvt((_Cvt *)&_USE(_Mysb::getloc(), _Cvt));
    		return (this);	// open succeeded
    		}
    

    Ich verwenden Builder 2010.
    Hab ich hier etwas falsch gemacht?

    MfG Stephan



  • Hallo

    Einen konkreten Auslöser sehe ich nicht. Die einzige offene Frage ist die Gültigkeit von sMainLogFile. Lokal, Referenz, Member, Global? Eine fehlende gültige Instanz hinter dieser Variable könnte für den Fehler verantwortlich sein.

    bis bald
    akari



  • @akari
    sMainLogFile ist eine private Variable der Klasse.
    D.h. es könnte auch ein Fehler in der fstream Implementierung sein.

    MfG Stephan



  • Hallo

    Das in der fstream-Implemenation ein Fehler ist, ist unwahrscheinlich, die Ursache ist eher in deinem eigenem Quellcode. Die Anwendung von fstream ist dann nur der Auslöser.
    Zum Beispiel könnte es sein, das zur Laufzeit gar keine korrekte Instanz deiner nicht näher genannten Klasse vorliegt, womit auch alle Member ungültig sind. Das passiert vor allem wenn man über Zeiger auf die fragliche Klasseninstanz zugreift, der nicht (mehr) auf eine gültige Instanz zeigt.
    Benutz den Debugger, um Programmablauf und Variablen zu prüfen.

    bis bald
    akari



  • @akari

    Sorry, hab mich vemutlich nicht richtig ausgedrückt, bzw zu wenig Infos geliefert.
    Die Variable ist Member der Klasse.
    Die Funktion welche fstream aufruft ist auch ein Member der gleichen Klasse. Somit sollte doch alles richtig sein.
    Und das beste ist noch, daß das Öffnen und Schreiben in die Datei funktioniert.

    MfG Stephan



  • Hallo

    Ich habe das schon richtig verstanden. Und immer noch bleibt z.B. offen, ob du beim Zugriff auf die Methode mit dem fstream auch eine gültige Instanz deiner Klasse verwendest?
    Mehr können wir hier anhand der Infos nicht dazu sagen. Benutz den Debugger, um die Ursache weiter auszugrenzen. Erstell ein neues Projekt mit einer Minimalanwendung von fstream, mit dem du den Fehler reproduzieren kannst (wenn du das nicht schaffst, ist damit auch bewiesen das die Ursache nicht in der fstream-Implementation steckt, sondern in deinem Code).
    Die Annahme, das die Ursache des Fehlers in der Implementation der Standard-Libraries steckt, ist jedenfalls viel zu voreilig, und erweist sich in den allermeisten Fällen als falsch.

    bis bald
    akari



  • @akari

    Hier mein Minimalbeispiel mit Codeguard Fehler.

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit7.h"
    #include <fstream>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm7 *Form7;
    //---------------------------------------------------------------------------
    __fastcall TForm7::TForm7(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm7::b1Click(TObject *Sender)
    {
        String sMainLogFile = ParamStr(0) + L"txt";
    
        std::basic_fstream<wchar_t> file;
        file.open(sMainLogFile.c_str(), std::ios_base::out | std::ios_base::binary | std::ios_base::app);
    
        file << L"Hallo" << L"\r\n";
    
        file.close();
    }
    //---------------------------------------------------------------------------
    

    Allerdings bekomme ich hier beim Schreiben den Fehler:

    Fehler 00099. 0x310000 (Thread 0x0E8C):
    Falscher Parameter: Falsches Datei- oder Pipe-Stream (0x32AFD894) wurde an die
     Funktion weitergegeben.
    fwrite(0x0012F30C, 0x1 [1], 0x1 [1], 0x32AFD894) 
    
    | d:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/fstream Zeile 265:
    | 					{	// converted something, try to put it out
    | 					size_t _Count = _Dest - &*_Str.begin();
    |>					if (0 < _Count && _Count !=
    | 						fwrite(&*_Str.begin(), 1, _Count, _Myfile))
    | 						return (_Traits::eof());	// write failed
    Aufrufhierarchie:
       0x0040A571(=Project5.exe:0x01:009571) d:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/fstream#265
       0x0040A059(=Project5.exe:0x01:009059) d:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/streambuf#465
       0x00403865(=Project5.exe:0x01:002865) d:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/streambuf#151
       0x004027AE(=Project5.exe:0x01:0017AE) d:\program files\embarcadero\rad studio\7.0\include\../include/dinkumware/ostream#768
       0x0040201D(=Project5.exe:0x01:00101D) Unit7.cpp#27
       0x502963E1(=vcl140.bpl:0x01:0D53E1)
    
    ------------------------------------------
    

    Irgendiwe habe ich das Gefühl, daß hier Codeguard etwas falsch macht.

    MfG Stephan


Anmelden zum Antworten