Benutzung von errno

07/07/2009 - 13:49 von Robert Hartmann | Report spam
Hallo zusammen,

Ich habe in der errno.h nach einem Fehlernummer benennenden
Namen für den Fehler "Index out of Range" gesucht, ihn aber
nicht gefunden. In der mir vorliegenden errno.h sind bis zu
42 Fehler aufgelistet unterbrochen von einigen unbekannten
Fehlernummern.

Ziel meiner Frage ist es eine Funktion, die im
Fehlerfall 0 zurückliefert und errno entsprechend
Ihrem Fehler setzt, zu schreiben mit der Signatur

int getPosData(*Array A, size_t pos)

dabei ist Array ein struct, der neben einem dynamisch
erzeugten Bereich für Integerwerte eine die Anzahl
aufnehmende Variable "anzahl" vom Typ size_t besitzt.

Offensichtlich könnte es zwei Arten von Fehlern geben:
1. Auf A kann nicht zugegriffen werden, wenn A NULL ist.
Hier müsste man errno wohl sinnvollerweise auf EFAULT (Bad address)
setzen.
2. Auf A kann zugegriffen werden, aber (pos>(anzahl-1)) oder (pos<0):
Hier könnte man errno wohl auf EINVAL (Invalid argument)
oder EACCES (Permission denied) setzen.

Auch meine Googlesuche nach errno + "Index out of range"
war nicht erhellend. Habt Ihr eine weitergehende Idee?

Gruß Robert
 

Lesen sie die antworten

#1 Michael Schumacher
07/07/2009 - 14:38 | Warnen spam
Robert Hartmann wrote:

Ich habe in der errno.h nach einem Fehlernummer benennenden
Namen für den Fehler "Index out of Range" gesucht, ihn aber
nicht gefunden. In der mir vorliegenden errno.h sind bis zu
42 Fehler aufgelistet unterbrochen von einigen unbekannten
Fehlernummern.

Ziel meiner Frage ist es eine Funktion, die im
Fehlerfall 0 zurückliefert und errno entsprechend
Ihrem Fehler setzt, zu schreiben mit der Signatur

int getPosData(*Array A, size_t pos)

dabei ist Array ein struct, der neben einem dynamisch
erzeugten Bereich für Integerwerte eine die Anzahl
aufnehmende Variable "anzahl" vom Typ size_t besitzt.

Offensichtlich könnte es zwei Arten von Fehlern geben:
1. Auf A kann nicht zugegriffen werden, wenn A NULL ist.
Hier müsste man errno wohl sinnvollerweise auf EFAULT (Bad address)
setzen.
2. Auf A kann zugegriffen werden, aber (pos>(anzahl-1)) oder (pos<0):
Hier könnte man errno wohl auf EINVAL (Invalid argument)
oder EACCES (Permission denied) setzen.

Auch meine Googlesuche nach errno + "Index out of range"
war nicht erhellend. Habt Ihr eine weitergehende Idee?



Ja: Finger weg von "errno" und selber Hand anlegen! :-)

Manche Compiler bieten eine Option, um einen "range check" bei
indizierten Feldzugriffen durchzuführen -- meide sie! Denn
erstens arbeiten sie nicht sicher (ein Zugriff über einen Alias,
und der Checker checkt's nicht mehr), und zweitens führt ein
erkannter Fehlzugriff zu einer Fehlermeldung mit anschließendem
Programmabbruch (nebst eventuellem Aufruf eines Debuggers).

Beim Aufspüren hartnàckiger Abstürze durch fehlerhafte Zugriffe
helfen auch Tools wie "valgrind", aber sie dienen eben dem Debuggen.

Wenn Du testen und reagieren willst, mußt Du die Tests selbst
durchführen. Wie man sich für ein dynamisch angefordertes
Feld die Größe in der Struktur selbst merken kann, hatten wir
gerade kürzlich (s. "Array length"); im Prinzip funktioniert das
natürlich auch mit statischen Feldern. Bei einem erkannten
Fehlzugriff aber bitte nicht "errno" beschreiben, denn der
schreibende Zugriff sollte der Laufzeitumgebung vorbehalten bleiben.


mike

Ähnliche fragen