C 假设错误总是积极的,安全吗?

C 假设错误总是积极的,安全吗?,c,x86-64,errno,suse,C,X86 64,Errno,Suse,我正在编写一个程序,其中大多数使用的库函数在出错时返回-1,并设置errno。程序的行为是,如果发生错误,它将退出。为了从程序外部确定准确的退出点和错误(例如使用gdb),我想使用以下方法: err=func_1(…arglist_1..); 如果(错误!=0) { perror(“func(…arglist…)); return((1u您的程序的退出状态限制为0..255,因此如果这些返回语句来自main()程序,则高阶位不相关 C标准(ISO/IEC 9899:2011§7.5错误)规定:

我正在编写一个程序,其中大多数使用的库函数在出错时返回-1,并设置errno。程序的行为是,如果发生错误,它将退出。为了从程序外部确定准确的退出点和错误(例如使用
gdb
),我想使用以下方法:

err=func_1(…arglist_1..);
如果(错误!=0)
{
perror(“func(…arglist…));

return((1u您的程序的退出状态限制为0..255,因此如果这些返回语句来自
main()
程序,则高阶位不相关

C标准(ISO/IEC 9899:2011§7.5错误
)规定:

errno

它扩展为可修改的左值(201),具有int类型和线程本地存储 持续时间,其值由多个库函数设置为正错误数

201)宏
errno
不需要是对象的标识符。它可能会扩展为可修改的左值 由函数调用产生(例如,
*errno()

C标准预计误差为正。POSIX(IEEE Std 1003.12013版)规定:

标题应定义以下宏,这些宏应扩展为类型为
int
的整数常量表达式,具有不同的正值(以下注释除外),并且适用于
#if
预处理指令:

因此,您可以合理地安全地假设(系统生成的)错误号为正,但您的代码可以将
errno
设置为负(或零).目前,没有任何POSIX系统生成的错误数高于200以下的某个位置,因此假设它们将限制在255是安全的,但从长期来看可能不是。没有理由限制它们


您声称的“真实性”仅适用于非线程程序。如果您是为线程支持而编译,则
errno
不会简单地声明为
extern int errno;
,并且在任何情况下都不应尝试为自己声明
errno
。声明它的唯一安全方法是通过

我怀疑这两种假设是否都是安全的。对于第二种假设,你认为“代码>0”/代码>肯定吗?“不<代码> 0”/代码>被排除为:<代码>在IEEE STD1003.1-2001卷中没有任何函数将ErrNO设置为0。< /代码>因为标准库中没有任何函数将其设置为<代码> 0 <代码>并不意味着其他人不将其设置为<代码> 0
。对于某些标准库函数,确定调用是否失败的唯一方法是首先将
errno
设置为
0
,然后查看函数的功能。@jxh:你是对的,Jonathan Leffler的答案解释了一切。是的,我在某个地方研究过成功返回-1并且可以只有将errno设置为0才能检查错误。@jxh:Eureka!!找到了!!这类函数的一个示例是:-)。好的,我得到了我的答案,谢谢乔纳森·莱夫勒。首先,他是对的,我打算在main()中这样做接下来,我的错误是,我忘记了多线程程序。我也用作参考,没有提到它总是正的。C89没有规定错误数是正的(只是非零);C99规定错误数是正的。有趣的是,POSIX 1997说“该
标题为errno提供声明,并为以下符号常量提供非零值。”这与当时的C89(C90)标准一致。@nishant:有趣-您链接到了
errno
的POSIX 2004页面,该页面没有提到“正”(POSIX 2013页面也没有提到),而我链接到了POSIX(2013)页面的
,该页面确实提到了它(POSIX 2004页面的标题也是如此)。我想我很幸运地选择了正确的位置进行查看;我没有意识到不对称性。