Speicherzugriffsfehler mit `fprintf`..?



  • Hallo zusammen

    Bei mir crasht folgende Funktion:

    void CMasterManager::reportAsOnLife()
    {
    
        bool bIntime = inIntervalSpan("reportasonlife");
        time_t timev;
        time(&timev);
        FILE *flagfile;
        std::stringstream fname;
        fname <<RUNNING_DIR<<"/DS/devstate";
        flagfile=fopen(fname.str().c_str(),"w");
    
        std::cout << "flagfile: " << flagfile << std::endl;
        std::cout << "fname: " << fname.str().c_str() << std::endl;
        std::cout << "timev: " << timev << std::endl;
    
        fprintf(flagfile, "%ld", (long) timev);
    
        exit(0);
    
        if(flagfile)fclose(flagfile);
    }
    

    ..wenn ich exit(0); oberhalb von fprint macht, dann gibt's keinen Speicherzugriffsfehler mehr.

    Ausgabe:

    flagfile: 0
    fname: /opt/x/DS/devstate
    timev: 1573211913
    Speicherzugriffsfehler
    

    -> Die Datei /opt/x/DS/devstate existiert, daran liegt's also nicht.

    P.S.: Bin totaler Anfänger, und der Urheber des Codes ist irgendwie selbst nicht ganz in der Lange mir richtig zu helfen. Habe jetzt alles möglich versucht, aber nix hilft...:-(

    Vielen Dank für die Feedbacks.

    Grüsse,
    Jan



  • Hallo,

    du nutzt schön streams, außer für das Dateischreiben. Warum? Dann hättest du das Problem erst gar nicht.
    Seis drum: fprintf erwartet die Adresse auf timev.


  • Mod

    @xdev sagte in Speicherzugriffsfehler mit &#x60;fprintf&#x60;..?:

    -> Die Datei /opt/x/DS/devstate existiert, daran liegt's also nicht.

    Eine gewagte Aussage, denn genau daran liegt es, wie du an

    flagfile: 0
    

    erkennen kannst. Hat der Nutzer, mit dem du das Programm ausführst, möglicherweise keine Schreibrechte dafür? Es ist eigentlich immer irgendetwas in dieser Art.

    Noch etwas wichtiges, das zwar nicht dein unmittelbares Problem löst, aber unbedingt angesprochen werden muss: Was soll das sein? C oder C++? Momentan mischt du beides auf die schlimmstmögliche Art und Weise. Du machst alles weswegen man immer vor Sprachmischmasch warnt. Du machst es hier zwar zufällig richtig, aber das ist wahrscheinlich eher Glückssache. Du wirst damit in Zukunft große Schwierigkeiten bekommen, also solltest du dich unbedingt sofort für eine Sprache entscheiden. Keine Ausreden.


  • Mod

    @Jockelx sagte in Speicherzugriffsfehler mit &#x60;fprintf&#x60;..?:

    Dann hättest du das Problem erst gar nicht.
    Seis drum: fprintf erwartet die Adresse auf timev.

    Beide diese Aussagen zweifle ich an.



  • @SeppJ
    Ich hab von C echt keine Ahnung; merke ich immer wieder.
    Oder zumindest springen mir offensichtliche Sachen scheinbar nicht ins Auge.



  • Hallo zusammen

    Vielen Dank für die schnellen Feedbacks! 🙂

    Es waren 2 Probleme dahinter:

    1. Habe das Programm nicht also root und auch nicht mit sudo/su ausgeführt
    2. Nach dem Ausführen als root habe ich gemerkt dass natürlich zuerst die Verzeichnisstruktur /opt/x/DS existieren muss.

    Das Problem war somit, dass das Programm nicht richtig geprüft hat was es kann und was nicht, und ob die Verzeichnisstruktur existiert oder nicht. Das hätte man besser behandeln, und dazu eine vernünftige Fehlermeldung ausgeben können.

    Habe schon gedacht die Meldung "Speicherzugriffsfehler" hänge mit irgendwelchen Memory-Allocation-Sachen zusammen und dass ich die nächsten x Tage dran sein werde das Problem zu fixen!

    "Noch etwas wichtiges, das zwar nicht dein unmittelbares Problem löst, aber unbedingt angesprochen werden muss: Was soll das sein? C oder C++? Momentan mischt du beides auf die schlimmstmögliche Art und Weise. Du machst alles weswegen man immer vor Sprachmischmasch warnt. Du machst es hier zwar zufällig richtig, aber das ist wahrscheinlich eher Glückssache. Du wirst damit in Zukunft große Schwierigkeiten bekommen, also solltest du dich unbedingt sofort für eine Sprache entscheiden. Keine Ausreden."

    -> Danke für deine Offenheit, ist aber eben nicht von mir! Werde es dem verantwortlichen Entwickler weiterleiten!!

    Grüsse, Jan


  • Mod

    Wenn euch das ein Entwickler geliefert hat, dann muss dieser entlassen werden. Das ist unter dem Niveau, das man nach einer Woche Anfängerlehrbuch hat. Und ein Anfängerlehrbuch bringt einem auch entweder C oder C++ bei, nicht einen Mischmasch aus beidem. Dies wirkt eher so wie von Stackoverflow zusammen kopiert, ohne überhaupt zu wissen, dass C und C++ unterschiedliche Sprachen sind.

    Es ist übrigens deswegen ein Speicherzugriffsfehler, weil hier wie in C mit Dateizeigern herumgespielt wird und Pointer immer auch mit Speicherzugriff assoziiert sind. Ein C-Programmierer hätte jetzt halt gewusst, wie und warum man damit richtig umgeht. Ein C++-Programmierer hätte keine Dateizeiger benutzt.



  • @xdev sagte in Speicherzugriffsfehler mit &#x60;fprintf&#x60;..?:

    -> Danke für deine Offenheit, ist aber eben nicht von mir! Werde es dem verantwortlichen Entwickler weiterleiten!!

    Der Kollege ist hoffentlich keiner, der dafür bezahlt wird. Als Hobbyprogrammierer im Anfängerstatus kann man das gerade noch so durchgehen lassen. Ich habe vor 15 Jahren auch noch viel Unsinn gemacht 😉 Wichtig ist, dass er versucht den Quellcode zu verbessern. D.h. die "FILE*" gehören rausgeworfen und std::ofstream verwendet. Konsequent.
    Bzw. std.:ifstream wenn man eine Datei lesen will.



  • @It0101 sagte in Speicherzugriffsfehler mit &#x60;fprintf&#x60;..?:

    D.h. die "FILE*" gehören rausgeworfen und std::ofstream verwendet. Konsequent.

    Das schlimmste an dem Code finde ich ehrlich gesagt den exit()-Aufruf. Der Beendet das Programm geradewegs, ohne die Destruktoren für lokale, automatische Objekte aufzurufen. Erinnere mich noch mit Grauen an diverse Debug-Sessions, wo eine verwendete C-Bibliothek mit exit-Calls gespickt war. In einer C++-Funktion hat das erst recht nichts zu suchen, aber auch in C-Bibliothekscode nimmt man damit auch dem reinen C-Anwender die Möglichkeit, selbst zu entscheiden, wann und wie das Programm beendet werden soll.

    Edit: War wohl mal wieder etwas zu schnell im übefliegen des Posts. Zum debuggen kann man das natürlich gerade noch so durchgehen lassen - auch wenn es Fehler geben könnte, die so ein exit verdeckt oder gerade erst verursacht. Besser Debugger nehmen 😉



  • @Jockelx

    Ich hab von C echt keine Ahnung; merke ich immer wieder.

    Wie immer heißt es dann konsequent: Klappe halten und Finger weg.
    Gilt auch für anderes im Leben. Es sei denn, man ist Manager oder Politiker.



  • @Wutz sagte in Speicherzugriffsfehler mit &#x60;fprintf&#x60;..?:

    Wie immer heißt es dann konsequent: Klappe halten und Finger weg.

    Konsequent wäre dann aber, wenn du gar nicht hier schreiben würdest 😉



  • @SeppJ sagte in Speicherzugriffsfehler mit &#x60;fprintf&#x60;..?:

    Wenn euch das ein Entwickler geliefert hat, dann muss dieser entlassen werden.

    Oder nach ... outgesourced werden.

    Ich habe schon zuviele Stilblüten gesehen, als das ich mich darüber aufregen würde.

    Die letzten Blüten:

    • system("regedit /s Options.reg"). Da kam die Frage warum man denn Admin Rechte fürs Schreiben in die Registry benötigt.
    • Modales Fenster welches in den Hintergrund gelegt werden s.d. das geblockte Fenster im Vordergrund steht
    • while (NonModalWindowIsStillOpen())
    • Weißer Client-Dialog ohne Rahmen zeigt einen Child Dialog mit weißem Client Bereich ohne Rahmen
      ...

    Aber hauptsache die Entwicklung ist schön billig.

    Daher wäre ich schon zufrieden, wenn man auf die Rückgabewerte achtet und dokumentiert.

    Das soll jetzt keine Kritik sein, sondern ich muss einfach mal Frust ablassen.


Log in to reply