【问题标题】:Can the exit code of a process overflow for small values?小值进程的退出代码会溢出吗?
【发布时间】:2016-04-19 18:59:52
【问题描述】:

我正在编写一个测试框架,并在 main() 中返回失败测试的数量。例如:

int main() {
    int failedTests = runTests();
    return failedTests;
}

那么这个“int”会溢出吗?当我实际返回不同于 0 的值时,我可以将 %ERROR_LEVEL% 变为 == 0 吗?它取决于主机操作系统吗?通常的最大值是多少?我可以确定整数

编辑:

我遇到了 python sys.exit 的问题,它总是(几乎)使用 0-127 范围,所以我现在要小心

【问题讨论】:

  • %ERROR_LEVEL% 不是适用于 windows cmd shell 吗?对于bash,您使用$? IIRC。
  • @πάνταῥεῖ 是的 - 我的问题适用于所有平台 - 任何信息都是有用的
  • 如果想在bash等中获取program的最后一个返回值,使用$?即可。
  • 有三个可移植的返回值:0、EXIT_SUCCESSEXIT_FAILURE。后两者在 中定义。除此之外,您还需要了解特定于系统的行为。

标签: c++ bash cmd terminal exit-code


【解决方案1】:

这取决于操作系统。在 Linux 上,它被限制为 8 位,因此可以是 0(表示成功)或任何不大于 255 的正整数。请参阅 _exit(2)wait(2)

只有两个值是标准化的(按名称):EXIT_SUCCESS(通常为 0)和EXIT_FAILURE(通常为 1)。请注意,标准定义了名称(可能还定义了 exit(0);... 的行为),但没有定义它们的值。

您可以将(失败测试的)数量写入stdout 或通过某个程序参数指定的某个文件。

FreeBSD 在其sysexits(3) 中定义了一组退出名称和代码,但它们不是标准化的,例如在 POSIX 中。见POSIX documentation on exit

【讨论】:

  • 错误! EXIT_SUCCESSEXIT_FAILURE 都没有附加任何值。它们的值是实现定义的。虽然0 表示程序执行成功,但EXIT_SUCCESS 并不要求也等于0
  • @Leandros - 他们没有定义实现。它们只是由实现定义的。 “实现定义”在标准中具有特殊含义:当某些行为是实现定义时,实现必须告诉您它的作用。
  • @Leandros - 不。 EXIT_SUCCESSEXIT_FAILURE 已经定义了行为:标准说明了它们的作用。实施没有义务说明这些名称的作用。 很可能是特定于实现的,但使用这些名称的效果不是实现定义的。
  • @Leandros - 我为 C++ 标准担任了八年的项目编辑,所以我认为我非常了解它。
  • @PeteBecker 为了一劳永逸地解决这个问题,是的,你是绝对正确的,我被标准误导了,我实际上认为它符合定义的实现。我绝对知道实现定义的含义,我只是认为这两种状态都符合条件。如果我粗鲁或不当,我深表歉意。
【解决方案2】:

是的,它可以像任何其他 int 一样溢出。

该标准将int 描述为至少16 位宽。返回任何不适合 int 的内容是未定义的行为。

C++ 程序运行的环境对值的作用是实现定义的,而不是标准描述的。

C++ 标准提到了三个值:EXIT_SUCCESSEXIT_FAILURE00EXIT_SUCCESS 都表示程序执行成功,而另一个定义失败。 EXIT_SUCCES 不需要为零。

引用 C++11 标准:

如果状态为零或 EXIT_SUCCESS,则 返回成功终止状态的实现定义形式。如果状态为 EXIT_- FAILURE,返回状态不成功终止的实现定义形式。 否则返回的状态是 implementation-defined.225

支持的常用值因实现而异,Windows 使用完整的 32 位整数作为返回值,可以通过各种方式获得完整的 32 位。 POSIX 仅指定如何获得低 8 位,因此 shell 通常会截断返回的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多