Speicherzugriffsfehler mit `fprintf`..?

#1
Hallo zusammen

Bei mir crasht folgende Funktion:

Code:
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:

Code:
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
 
Zuletzt bearbeitet von einem Moderator:
#2
Hallo zusammen

Problem gelöst! 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! ;-)


Grüsse, Jan
 

Jan Krüger

Well-Known Member
c-b Team
c-b Experte
#3
Es ist ja auch ein Speicherfehler. :) fopen gibt nämlich NULL zurück, wenn irgendwas schiefgeht - und wenn du den Pointer dann ungeprüft benutzt/dereferenzierst, explodiert das. In dem Fall war der Grund für den NULL-Pointer, dass die Zugriffsrechte für die Datei fehlten (bzw. auch gleich das ganze Verzeichnis). Generell solltest du den Rückgabewert prüfen und eine ordentliche Fehlerbehandlung machen - sonst wird es später beim Ausführen des Programms schwer, den Grund für einen Absturz zu durchschauen.

PS. Code formatieren geht hier im Forum nicht mit ```, sondern mit den CODE-Tags (auch leicht über die kleine Editor-Toolbar einfügbar). Ich hab deine Code-Blöcke mal nachformatiert.
 
Oben