2016-03-29 3 views
3

In include/linux/err.h, gibt es folgende definiert:Warum wirft IS_ERR_VALUE negative MAX_ERRNO auf eine vorzeichenlose Länge?

#define MAX_ERRNO  4095 

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) 

Die Idee ist, für eine gültige Fehlernummer an die Stelle eines Zeigers zurück zu überprüfen, aber warum tut hat MAX_ERRNO eine unäre - vor ihm, bevor sie als nicht signiert? Es scheint, wie dies in x auf die maximale MAX_ERRNO lang minus verglichenen führen würde, anstatt zu 4095

+1

Da die Zeiger mit Adressen 0x0000 .. 0x0fff gültig sind (OK, erste 16, IIRC, Adressen werden verwendet, um NULL PTR darzustellen). Aber der obere Platz ist für * ungültige [nie verwendete] Zeiger * reserviert. NB: Wir sprechen über virtuelle Adressen. – 0andriy

Antwort

2

Es sieht aus wie eine Optimierung nur ein Vergleich zu verwenden, um zu überprüfen, um zu sehen, ob x zwischen -4095 und -1 ist, auch bekannt als ein gültiger Fehlercode Für eine signed long würden Sie zwei Vergleiche benötigen:

(x >= -4095 && x < 0)

-4095 in 0xff...ff001 zu einem unsigned long Ergebnisse Casting, die nur 4094 Zahlen über sich hat, bevor ULONG_MAX erreicht. Diese Werte sind auch ungültige Zeigeradressen am Ende des Adressraums (daher wird dieser Bereich für Fehlercodes in Funktionen verwendet, die void-Zeiger zurückgeben).

Somit wird die Bedingung wahr zurück, wenn x >= 0xff...ff001, die für den signierten Bereich von -4095 zu -1 (der gültigen Fehlercode-Bereich) wahr ist.

Verwandte Themen