"File corrupt" 错误号?

"File corrupt" errno?

是否有常规的errno代码来指示指定的文件已损坏(它不符合应有的文件格式)?

我正在编写文件解析器,但不知道 return 最合适的代码是什么。总是有 EINVAL,虽然我希望得到比这更具体的东西,因为它也可以用于任何其他无效参数,尤其是在我的情况下,调用者知道调用失败是有价值的,因为该文件已损坏。

EBADFEDOMEILSEQEIOENOSTREPROTO 是我看到的那些想像的一部分被用于这样的意思,但是这种情况有约定俗成吗?

我的偏好是 EBADMSG,然后是 EPROTO,最后是 EINVAL 作为最后的通用手段。

一些相关的讨论在这里:https://github.com/billziss-gh/winfsp/issues/156

在我个人看来,您不应该依赖 returning 系统错误代码之一,而应该给出正确的诊断,并对您面临的问题和用户可能采取的方式进行易于理解的解释您的软件可以修复。

已经是 2018 年了,我们可以抛出异常和 return 字符串,而不是 8 位整数。

这是当代的"MISRA C++:2008 Guidelines for the use of the C++ language in critical systems",阅读它们,使用它们。使用 errno 禁止的 (参见规则 19-3-1)。

errno code to indicate that the specified file [...] does not conform to the file format it should be

EFTYPE呢?

挑剔的人可能会争辩说此代码适用于 "opposite" 案例:

来自the related POSIX specs

This error code was proposed in earlier proposals as "Inappropriate operation for file type", meaning that the operation requested is not appropriate for the file specified in the function call.

不过好吧...

在您的库代码中设置 errno 可能不是一个好主意,除非您可以保证您调用的 OS 函数不能将 errno 设置为相同的值。否则,您无法区分库中的错误或库调用的 OS 函数中的错误。

我更喜欢为我的库定义我自己的一组错误代码,并保留一个错误代码来表示 OS 错误。像这样:

enum mylib_err
{
   MYLIB_ERR_NO_ERROR = 0,
   MYLIB_ERR_ERRNO, /* Check errno for further info */
   MYLIB_ERR_PARSE_ERROR,
   MYLIB_ERR_PLANETS_WRONGLY_ALIGNED,
   ... etc..
};

...

enum mylib_err err = mylib_parse_file(....);
if (err)
{
   if (err == MYLIB_ERR_ERRNO)
     error(EXIT_FAILUER, errno, "xxxx");
   else
     .. some other error handling
}

好吧,POSIX(以及之前的 UNIX)没有强制文件格式,因此很难发出格式错误的信号。文件只是一个字节序列,其中任何字节都可以跟在文件中的前一个字节之后。读取时无需指定记录边界或大小,因此我们如何识别文件不符合格式?

Errno 值用于识别系统错误(发出系统调用时由于系统中的某些条件而产生的错误)因此没有 ESOMETHING 错误格式常量。

顺便说一句,符合 errno 变量值的数字列表是系统特定的,并且会随着 kernel/stdlib 版本的不同而变化...所以你不能select 一个号码,并确保您 select 输入的号码不会被系统在未来的版本中使用。

因此,使用 errno 到 return 错误代码是不好的做法。许多库遵循与 stdlib 相同的模式,但带有前缀 something_errno 变量。这是我给你的推荐。

无论如何,一个解析器通常returns return 一个解析树(句法树),无论如何你都可以使用节点字段来指示解析错误。不要污染系统错误的含义,只为它们的设计目的而使用它们。