malloc und errno

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

malloc und errno
Bin grad beim cleanup: Sollte z.b. free EINVAL oder sowas zurückgeben, wenn irgendein schwachsinniger Pointer übergeben wird? Hab leider keine Übersicht gefunden welche Befehle welche errnos zurückgeben können.


man 3 errno
erlaeutert das ein Stueck weit.

Welche errnos welche Bedeutung haben, steht in der jeweiligen manpage
des Befehls, der errno setzt. Da gibt’s keine globale Konvention.

EFAULT (bad address) oder EINVAL waeren in unseren Fall der free-Funktion
sinnvolle Werte, Als Ergebnis sollte -1 geliefert werden.
Unser free unterscheidet sich damit aber von dem free in der C-Library.
Das liefert kein Ergebnis und setzt auch errno nicht.
Aber das wollten wir so (ist eigentlich ja auch besser wie beim original free).


Ich bin jetzt gerade mal etwas verunsichert, die vorgegebenen Dateien sagen ja, dass free keinen Rückgabewert hat, und in der Aufgabenstellung steht, dass wir bei ungültigem Speicherbereich im free ein abort() aufrufen sollen. Also soll unser free nichts zurückgeben, keine errno setzen und abort()-en, oder -1 zurückgeben (wobei wir dann ja die vorgegebenen Dateien ändern müssten), errno setzen und nicht abort()-en?
Fragen über Fragen … :smiley:


free() ist vom Typ void, kann also gar nichts zurückgeben.
Es gibt folgende Szenarien (in keinem ist ein Setzen von errno erforderlich bzw. sinnvoll):

  1. free() bekommt gültigen Pointer, 0x00beef00 wird gefunden. Dann den Block freigeben.

  2. free() bekommt einen NULL Pointer. In diesem Fall tut free einfach gar nichts.

  3. free() bekommt einen Pointer auf ungültigen Speicher, oder der Heap ist durch Fehlverhalten der Anwendung korrupt. In diesem Fall bricht das Programm mit abort() ab.


ist doch immer wieder gut, wenn jemand noch die Aufgabenstellung liest und dann sogar noch drueber nachdenkt :slight_smile:
sorry fuer die Verunsicherung.
Meine Idee, sinnvolle Rueckgabewerte fuer free einzufuehren, fand ich ja zuerst gar nicht
schlecht - aber es ist keine so gute Idee, die Schnittstelle von Standard-Bibliotheksfunktionen
umzudefinieren. Damit tut man sich sicherlich nix Gutes.
Damit ist die abort()-Funktion natuerlich die sinnvollste Alternative:
free stellt fest, dass die Daten korrupt sind - damit kann das Programm nicht sinnvoll
weiterlaufen. Wenn man sich das genauer ueberlegt, ist so eine Situation ist eigentlich
grundsaetzlich voellig verfahren - die Datenstrukturen sind irgendwie kaputt, selbst mit einer
entsprechenden Fehlermeldungsschnittstelle zurueck zur aufrufenden Funktion ist da eigentlich
nicht viel zu retten (was soll die Funktion denn tun - den Speicher einfach nicht freigeben? -
ist ja eigentlich auch keine Loesung).
Insofern ist eine Programmabbruch mit abort() sowieso die sinnvollste Loesung.
So eine Situation koennte dann ein Programm (unabhaengig von der Aufgabe hier jetzt)
grundsaetzlich sogar noch abfangen (wie das geht, erzaehlen wirbei den Signalen)
um z.B. noch ein recovery-File zu schreiben, damit keine Daten voellig verloren gehen.
Daten in irgendwelche Original-Dateien noch zurueckzuschrieben waere in einer Situation, in der
man feststellen musste, dass Datenstrukturen irgendwie kaputt sind, keine gute Idee mehr.
Wenn etwas “irgendwie kaputt” sit weiss man ja nicht, was alles wirklich icht mehr
konsistent ist.


Hilfe!!! :wand:

Warum fuer diese Zeilen:


char **arr=0;

if (! arr)
{
if (arr = (char **)malloc(sizeof(char *)) == NULL)
{
perror (“Fehler bei malloc()\n”);
exit(EXIT_FAILURE);
}
}

else if (arr = (char **) realloc (arr, i*sizeof(void *)) == NULL)
{
perror (“Fehler bei realloc()\n”);
exit(EXIT_FAILURE);
}

gibt mir Compiler folgendes aus:

gcc -ansi -pedantic -D_POSIX_SOURCE=500 -Wall -Werror -o printdir printdir.c
cc1: warnings being treated as errors
printdir.c: In function main': printdir.c:56: warning: assignment makes pointer from integer without a cast printdir.c:56: warning: suggest parentheses around assignment used as truth value printdir.c:62: warning: assignment makes pointer from integer without a cast printdir.c:62: warning: suggest parentheses around assignment used as truth value *** Error code 1 make: Fatal error: Command failed for target printdir’

Danke im voraus.


Zeilennummern wären ganz cool. Aber versuch mal die Zuweisung einzuklammern.


Wau!!!
Es hat geklappt!!!

Danke! :gun: