Laufzeitfehler?



  • Hallo, sry das so viele Beiträge von mir sind 🙄
    Aber habe demnächst Prüfung.

    folgendes:

    Aufgabe: Die Funkt. insertStud(...) fügt einen Datensatz sortiert in die Liste. Sie erzeugt keine Fkt.Wert. Bei einem Misserfolg der Speicherallokation darf sie keinen Laufzeitfehler verursachen.

    Heißt das z.B.
    Annahme:

    struct iwas *zeiger = malloc(sizeof(iwas));
    
    if(zeiger != NULL)
       do smth.
    else
       Fehler.
    

    Simmt das mit Laufzeitfehler oder hab ich das flasch verstanden?



  • Das else Fehler ist noch nicht einmal nötig.

    Aber die rufende Funktion sollte schon wissen, dass da ein Fehler aufgetreten ist.
    Daher ist "Sie erzeugt keine Fkt.Wert." eine schlechte Idee.



  • Mit "Laufzeitfehler" meinen die wohl Abstürzen, was häufig Folge von undefiniertem Verhalten ist. Undefiniertes Verhalten hätte man beispielsweise, wenn man einen Nullzeiger dereferenzieren würde. Du sollst wahrscheinlich die Überprüfung des Zeigers einbauen. Es ist allerdings ganz schlechter Stil so einen Fehler vor dem Aufrufer zu verheimlichen. Die Funktion sollte zurückgeben, ob die Operation erfolgreich war oder nicht. Das macht malloc richtig.



  • Ich schreibe eigentlich immer so was hier:

    int my_errno;
    void*pointer;
    
    if(!(pointer=malloc(bla)) && (my_errno=errno))
        return my_errno;
    
    /*Und weiter ...*/
    

    Das hat sogar den Vorteil, dass die aufrufende Funktion den Fehlercode zurückbekommt. Damit kannst du dann bestimmte Fehler abfangen, die die Funktion eventuell noch gerade so alleine machen kann.

    Aber dass das keinen Laufzeitfehler verursacht, ist nicht garantiert. Weil in der Regel malloc schon einen Zeiger auf Speicherbereich zurückgibt, von dem der Kernel gesagt hat, dass er dafür Speicher reserviert. Das tut er aber (zumindest unter Linux) nicht sofort. Sondern erst dann, wenn dieser Speicher auch angefasst wird. Und wenn die Hardware dann einen Page Fault sendet und der Kernel merkt, dass er den versprochenen Speicher nicht bereitstellen kann, werden schon mal andere Prozesse gekillt oder dein Programm direkt beendet. Das würde ich in die Kategorie "Laufzeitfehler" mitnehmen.

    EDIT: Ja, mir ist bekannt, dass errno nicht immer gesetzt werden muss. Aber ehrlich: wenn deine Laufzeitumgebung nicht den Fehlercode speichert, dann haben die Programmierer verkackt, die sie aufgezogen haben. Deswegen ist das auch ein "Test", um solche Umgebungen zu entdecken. 🙂


Anmelden zum Antworten