Sto scrivendo un programma in cui la maggior parte delle funzioni della libreria utilizzata restituisce -1 su errore e imposta errno. Il comportamento del programma è tale che esce se si verifica un errore. Per determinare esattamente punto di uscita e l'errore di fuori del programma (ad esempio utilizzando gdb
), voglio usare il metodo seguente:E 'sicuro assumere errno essere sempre positivo?
err = func_1(..arglist_1..);
if(err != 0)
{
perror("func(..arglist..)");
return ((1u << 8) | errno);
}
//..
//.. some more funcs
//..
err = func_n(..arglist_n..);
if(err != 0)
{
perror("func(..arglist_n..)");
return (((unsigned)n << 8) | errno);
}
Il problema qui è ipotesi sicure.
Realtà:errno è dichiarato come extern int errno;
all'interno errno.h
Assunzione 1: Valore di errno è sempre inferiore a 255.
Ipotesi 2:errno è sempre positivo.
Sulla base di tutte le costanti di errore (EAGAIN, ecc.) Definite in errno.h
, al momento queste ipotesi sono vere. Si può ritenere che ciò sia vero anche in futuro?
P.S .: Non voglio dipendere da perror()
per determinare il punto di uscita.
Dubito che entrambe le ipotesi siano sicure. Per il secondo, consideri '0' positivo? – jxh
No '0' è escluso poiché [questo collegamento qui] (http://pubs.opengroup.org/onlinepubs/009695399/functions/errno.html) dice:" Non verrà impostata alcuna funzione in questo volume di IEEE Std 1003.1-2001 errno a 0! –
Proprio perché nessuna funzione nella libreria standard la imposta su '0' non significa che qualcun altro non lo imposta a' 0'. Per alcune funzioni di libreria standard, l'unico modo per determinare se la chiamata non è riuscita è innanzitutto impostare 'errno' su' 0' e poi vedere cosa fa la funzione. – jxh