Я пишу программу, в которой большинство используемых функций библиотеки return -1 при ошибке и установить errno. Поведение программы таково, что она выходит, если возникает ошибка. Для того, чтобы определить точную точку выхода и ошибки из-за программы (например, с помощью gdb
), я хочу использовать следующий метод:Можно ли предположить, что errno всегда будет положительным?
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);
}
Проблема здесь безопасные предположения.
Действительность:ERRNO объявлен как extern int errno;
внутри errno.h
Предположение 1: Значение ERRNO всегда меньше 255.
Предположение 2:ERRNO всегда положительна.
На основании всех констант ошибок (EAGAIN и т. Д.), Определенных в errno.h
, эти предположения в настоящее время верны. Могут ли они считаться истинными и в будущем?
P.S .: Я не хочу зависеть от perror()
, чтобы определить точку выхода.
Сомневаюсь, что любое предположение безопасно. Для второго, считаете ли вы «0» положительным? – jxh
Отсутствует '0', поскольку [эта ссылка здесь] (http://pubs.opengroup.org/onlinepubs/009695399/functions/errno.html) говорит:' Никакая функция в этом томе IEEE Std 1003.1-2001 не будет установлена errno to 0.' –
Просто потому, что никакая функция в стандартной библиотеке не устанавливает ее в '0', не означает, что кто-то другой не устанавливает ее в' 0'. Для некоторых стандартных функций библиотеки единственный способ определить, был ли сбой вызова, - это сначала установить 'errno' в' 0', а затем посмотреть, что делает функция. – jxh