【问题标题】:What does main() return on run-time exception?main() 在运行时异常返回什么?
【发布时间】:2019-09-06 06:33:51
【问题描述】:

当程序遇到运行时异常(例如分段错误)时,C int main() 函数返回什么?

在寻找答案时,我点击了很多关于 what main() should return, like this one 的讨论/帖子。

【问题讨论】:

  • 你在问什么平台? Linux?你能添加相关的标签吗?
  • @SanderDeDycker 不针对特定平台。
  • @meaning-matters :那么这个问题是不可回答的:硬件异常不在 C 标准中。
  • @SanderDeDycker C 标准没有说明访问空指针、被零除...?

标签: c exception main


【解决方案1】:

如果程序崩溃,它(main 函数)不会返回。如果一个程序崩溃,那么操作系统会杀死该程序,因此该程序不再运行,其中包括 main 函数。一个不运行的程序不能自己返回任何东西。什么“返回”到运行环境取决于操作系统,它在程序之后接管了。

返回的内容由操作系统处理。对于 POSIX 系统,被信号杀死的进程(如SIGSEGV,分段错误)操作系统将返回128 加上信号编号。这记录在例如this waitpid reference page(以及其中的链接)。

对于 Windows,它通常报告为一个神秘的 long 值(通常是值 0x80000000 加上其他标志和数据)。

对于不处理崩溃的较旧或更原始的操作系统,“返回”的值通常是“返回值”寄存器中或崩溃时堆栈顶部的值。

【讨论】:

  • 当然,但是传递给系统的值是什么(在某些平台上可以在 shell 中捕获)?
  • 等待函数的状态表明进程死于信号以及它是哪个信号。查看 wait()waitpid() 或任何其他选项的手册页。
  • @meaning-matters 对于 shell,如果进程因信号而终止,posix 表示 $? 将是大于 128 的数字。bash 使用 128+信号编号;其他人也可能。
  • @Someprogrammerdude 您应该将您的最后一条评论移至答案。这就是 OP 真正想知道的。
  • @Joel 如果程序崩溃,它将不再运行。这包括main 函数,如果它没有运行,它只是无法返回任何东西。
【解决方案2】:

如果程序崩溃,它不会返回任何值。这将由操作系统来处理,但 C 标准没有说明应该发生什么。调用程序时,行为可以这样描述:

int mainWrapper() {
    int ret;
    try {
        ret = main();
    }
    catch(Exception e) {
        ret = // Some value that may or may not depend on what 
              // happened and might even be random
    }
    return ret;
}

当您在机器代码中调用函数时,实际发生的情况是您只需将代码中您所在位置的地址存储在某个位置,然后跳转到您要执行的代码。该代码可能对某些包含您要传递给该函数的参数的寄存器有一些假设。如果您忘记加载这些寄存器,代码将使用那里的任何内容,而不知道您忘记发送参数。函数结束时也是如此。当机器代码遇到某个返回指令时,就会发生这种情况。该指令将跳回到我们调用它的地方。如果之后的代码期望函数返回一些东西,它基本上只是希望函数将其返回值存储在正确的位置,然后在不知道是否是这种情况的情况下读取它。

所以简短的回答是它可能包含一个随机值或由操作系统决定的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    相关资源
    最近更新 更多