gpt4 book ai didi

c - 假设 errno 始终为正是否安全?

转载 作者:太空狗 更新时间:2023-10-29 17:07:13 26 4
gpt4 key购买 nike

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

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);
}

这里的问题是安全假设。

现实:errnoerrno.h
中声明为extern int errno;假设 1:errno 的值始终小于 255。
假设 2:errno 始终为正。

根据 errno.h 中定义的所有错误常量(EAGAIN 等),这些假设目前是正确的。这些是否也可以假设在未来也是正确的?

P.S.:我不想依赖 perror() 来确定退出点。

最佳答案

您的程序的退出状态被限制为 0..255,因此如果这些返回语句来自 main()程序,高位是无关紧要的。

C 标准(ISO/IEC 9899:2011 §7.5 错误 <errno.h>)说:

errno
which expands to a modifiable lvalue201) that has type int and thread local storage duration, the value of which is set to a positive error number by several library functions.

201) The macro errno need not be the identifier of an object. It might expand to a modifiable lvalue resulting from a function call (for example, *errno()).

C 标准期望误差为正。 POSIX(IEEE Std 1003.1,2013 年版)声明 <errno.h> :

The <errno.h> header shall define the following macros which shall expand to integer constant expressions with type int, distinct positive values (except as noted below), and which shall be suitable for use in #if preprocessing directives: ...

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

您声称的“现实”仅适用于非线程程序。如果您正在编译线程支持,那么 errno不是简单地声明为 extern int errno;在任何情况下,您都不应尝试声明 errno为自己。声明它的唯一安全方法是通过 <errno.h>标题。

关于c - 假设 errno 始终为正是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18351110/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com