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.
Halde - memcpy verwendbar?
Hallo.
Da die aktuelle Aufgabenstellung nicht 100% exakt ist, dachte ich, ich frage mal lieber hier nach.
Und zwar steht dort zu realloc:
Heißt das, wir dürfen die memcpy-Methode aus der Standard-C-Bibliothek benutzen oder müssen wir uns selbst eine memcpy-Methode schreiben?
Ersteres.
Alles klar, vielen Dank.
Da kommt mir noch eine Frage zur errno:
In der manpage steht nur, dass die errno “upon failure” gesetzt wird.
Also natürlich, wenn nicht genug Speicher bereit steht.
Aber wenn man NULL übergeben bekommt in realloc oder ne size <= 0, soll man dann auch die errno setzen bevor man NULL returnt?
Wenn realloc als free/malloc “missbraucht” wird, nehme ich an, soll man die errno nicht setzen?
Die Man-Page sollte eigentlich alles enthalten, aber du kannst auch einfach ausprobieren, wie das Standardlibrary die Fälle behandelt.
Ist halt die Frage ob das so eine gute Idee ist. Die Implementierung soll ja konform zu POSIX bzw. C99 sein, nicht zu irgendeiner anderen Implementierung. size wird nie kleiner als 0 sein, weil size_t immer unsigned ist. Und wie realloc sich verhaelt, wenn man einen NULL-Zeiger uebergibt steht in der manpage drin.
Ok, ich war in der Rechnerübung und habe einen Tutor gefragt.
In der manpage steht nicht, wann die errno gesetzt wird!
Falls noch jemand die Frage hat:
Die errno ist nur zu setzen, wenn der verfügbare Speicher kleiner ist als der angeforderte.
(Keine Garantie, aber ich denke auf Tutoraussage kann man sich schon verlassen.)
RETURN VALUE
Upon successful completion with size not equal to 0, malloc() shall return a pointer to the allo-
cated space. If size is 0, either a null pointer or a unique pointer that can be successfully
passed to free() shall be returned. Otherwise, it shall return a null pointer and set errno to
indicate the error.
ERRORS
The malloc() function shall fail if:
ENOMEM Insufficient storage space is available.
Quelle: man 3p malloc
Ah, perfekt. Vielen Dank. Den Befehl kannte ich noch nicht.
Jetzt hab ich ne neue Frage, sind fast abgabebereit.
In der free() soll ja abort() aufgerufen werden, wenn der Pointer ungültig ist.
Soll dies auch geschehen, wenn die Adresse außerhalb des von uns verwalteten Bereichs liegt?
Ich wollte gucken, ob test-ref dann ein abort() wirft, allerdings spuckt das nur einen Segfault heraus, Beweisscreenshot im Anhang.
Der Test-Code, der das ausgelöst hat:
char* ptr = (char*) 0x01234fec;
char* ptr2 = (char*) 0xff0c3fea;
free(ptr);
free(ptr2);
Attachment:
segfault.JPG: https://fsi.cs.fau.de/unb-attachments/post_140792/segfault.JPG
Kannst du machen wie du willst:
Ja gut, aber in dem Fall ist ja von der Aufgabenstellung vorgeschrieben, wie sich die free() zu verhalten hat. Nur eben nicht ganz exakt, wie ich finde.
Das ist doch exakt genug?
Da steht nicht, dass du prüfen sollst, ob der Pointer innerhalb des von dir verwalteten Speichers liegt. Da steht auch nicht, dass du in anderen Fällen abort(3) aufrufen musst. Nur wenn die Magic Number nicht die gleiche ist, musst du abort(3) aufrufen.
In diesem Fall macht dann das „undefined behavior“ aus [m]man p free[/m] auch Sinn: Müsste man jedes mal erst prüfen, ob der Speicher auch gemappt und lesbar ist (und deswegen beim Zugriff auf die Magic kein Segfault auftreten wird) wäre das erstens deutlich langsamer und zweitens auch noch ein TOCTOU-Problem.