由于堆栈溢出,C 中通常会发生什么?
What does typically happen in C due to stack overflow?
在 Java 中会有一个堆栈跟踪显示 WhosebugError
并且整个系统不会崩溃,只有程序会崩溃。
在 C 中,我知道数组索引越界会产生分段错误。 C中的堆栈溢出是否也一样,并且还会出现分段错误,即类似问题的相同错误类型?
我并没有在 C 语言中测试有意识的无限复活以查看会发生什么,因为我不知道后果。
或者有时情况更糟,C 中的堆栈溢出可能会导致操作系统故障并迫使您重启电源才能恢复?或者更糟的是,造成不可逆转的硬件损坏?堆栈溢出错误会造成多大的影响?
很明显 Java 中的保护比 C 中的更好。C 中的保护是否比汇编/机器代码中的更好,或者 C 中的保护实际上与组装?
这不是C的问题,至少发生的事情不是C指定的。C只会说这是未定义的行为。所以效果是运行时的问题。在任何合理的 OS 上,这将产生某种将被捕获的错误,并且在 *nixes 中将对您的进程产生分段错误。即使是异国情调的小型 OSes 也会保护自己免受错误过程的影响。无论如何,这永远不会使 OS 崩溃。
Java 并不比 C 好,它们是不同的语言并且具有不同的运行时。 Java 在设计上更安全,因为它可以保护您免受许多内存 问题 (以及其他)。 C 让您可以更好地控制机器,是的,它或多或少是一种汇编语言。
每个正在执行的线程都在运行时线程创建期间分配了堆栈。如果在程序执行过程中检测到堆栈溢出(本机程序已编译),只有您的程序(进程)会受到影响,而不是 OS.
In C I'm aware that an array index out of bounds will produce a segmentation fault. Is it the same for a stack overflow in C and there will also be a segmentation fault i.e. same error type for a similar problem?
在 C 语言中无法保证 会出现 分段错误。 C 标准说它是 undefined behaviour 并保留它。这可能如何体现,完全取决于 implementation/platform。
Or is it sometimes something much worse and a stack overflow in C could cause an operating system failure and force you to power cycle to get back? Or even worse, cause irreversible hardware damage? How bad effects can a stack overflow mistake have?
在现代操作系统上,系统很少会发生任何不幸的事情;通常,只有程序会崩溃。现代操作系统使用 various memory protection techniques.
It seems clear that the protection is better in Java than in C. Is it any better in C than in assembly / machine code or is it practically the same (lack of) protection in C as a assembly?
那是因为在Java中,内存是"managed"。在 C 中,它留给程序员; 设计。 C 编译器最终会生成机器代码;所以它不会更好或更坏。明显地,
一个好的编译器可以检测到其中的一些问题并警告你,这是 C 与汇编相比的一个优势。
内存故障的处理,就像任何系统资源故障一样,基本上是由 OS 处理的,而不是语言本身。
排除一些特定的预防措施,如堆栈检查,这种问题通常会触发一个OS异常,可以由语言运行时处理。
堆栈检查如果启用,通常在编译器命令行上指定一些开关,指示编译器为每个堆栈消耗操作插入检查探测代码以验证内存可用性。
默认情况下,当出于任何原因过度使用堆栈或损坏时,执行尝试访问已分配堆栈范围之外的内存space OS 会触发结构化异常。 Java 尽可能多的 C 运行时通常会处理这些异常,并提供一些方法将它们传递给用户代码以进行最终恢复(即通过信号或 SEH)。如果没有与用户代码相关联的处理程序,则将控制传递给运行时,默认情况下将管理受控任务关闭(正常关闭)。
如果没有处理可用,甚至在运行时也没有,OS 将关闭任务并运行突然的资源释放(即截断文件、关闭端口等)。
在任何情况下 OS 都会保护系统,除非 OS 如果有缺陷...
在 C 中,通常会注册一个处理程序来保护可能失败的代码片段。您处理异常的方式取决于您的 OS(即在 windows 下,您可以将可能失败的代码包装在异常处理程序 __try __except
中)。
在 Java 中会有一个堆栈跟踪显示 WhosebugError
并且整个系统不会崩溃,只有程序会崩溃。
在 C 中,我知道数组索引越界会产生分段错误。 C中的堆栈溢出是否也一样,并且还会出现分段错误,即类似问题的相同错误类型?
我并没有在 C 语言中测试有意识的无限复活以查看会发生什么,因为我不知道后果。
或者有时情况更糟,C 中的堆栈溢出可能会导致操作系统故障并迫使您重启电源才能恢复?或者更糟的是,造成不可逆转的硬件损坏?堆栈溢出错误会造成多大的影响?
很明显 Java 中的保护比 C 中的更好。C 中的保护是否比汇编/机器代码中的更好,或者 C 中的保护实际上与组装?
这不是C的问题,至少发生的事情不是C指定的。C只会说这是未定义的行为。所以效果是运行时的问题。在任何合理的 OS 上,这将产生某种将被捕获的错误,并且在 *nixes 中将对您的进程产生分段错误。即使是异国情调的小型 OSes 也会保护自己免受错误过程的影响。无论如何,这永远不会使 OS 崩溃。 Java 并不比 C 好,它们是不同的语言并且具有不同的运行时。 Java 在设计上更安全,因为它可以保护您免受许多内存 问题 (以及其他)。 C 让您可以更好地控制机器,是的,它或多或少是一种汇编语言。
每个正在执行的线程都在运行时线程创建期间分配了堆栈。如果在程序执行过程中检测到堆栈溢出(本机程序已编译),只有您的程序(进程)会受到影响,而不是 OS.
In C I'm aware that an array index out of bounds will produce a segmentation fault. Is it the same for a stack overflow in C and there will also be a segmentation fault i.e. same error type for a similar problem?
在 C 语言中无法保证 会出现 分段错误。 C 标准说它是 undefined behaviour 并保留它。这可能如何体现,完全取决于 implementation/platform。
Or is it sometimes something much worse and a stack overflow in C could cause an operating system failure and force you to power cycle to get back? Or even worse, cause irreversible hardware damage? How bad effects can a stack overflow mistake have?
在现代操作系统上,系统很少会发生任何不幸的事情;通常,只有程序会崩溃。现代操作系统使用 various memory protection techniques.
It seems clear that the protection is better in Java than in C. Is it any better in C than in assembly / machine code or is it practically the same (lack of) protection in C as a assembly?
那是因为在Java中,内存是"managed"。在 C 中,它留给程序员; 设计。 C 编译器最终会生成机器代码;所以它不会更好或更坏。明显地, 一个好的编译器可以检测到其中的一些问题并警告你,这是 C 与汇编相比的一个优势。
内存故障的处理,就像任何系统资源故障一样,基本上是由 OS 处理的,而不是语言本身。
排除一些特定的预防措施,如堆栈检查,这种问题通常会触发一个OS异常,可以由语言运行时处理。
堆栈检查如果启用,通常在编译器命令行上指定一些开关,指示编译器为每个堆栈消耗操作插入检查探测代码以验证内存可用性。
默认情况下,当出于任何原因过度使用堆栈或损坏时,执行尝试访问已分配堆栈范围之外的内存space OS 会触发结构化异常。 Java 尽可能多的 C 运行时通常会处理这些异常,并提供一些方法将它们传递给用户代码以进行最终恢复(即通过信号或 SEH)。如果没有与用户代码相关联的处理程序,则将控制传递给运行时,默认情况下将管理受控任务关闭(正常关闭)。
如果没有处理可用,甚至在运行时也没有,OS 将关闭任务并运行突然的资源释放(即截断文件、关闭端口等)。
在任何情况下 OS 都会保护系统,除非 OS 如果有缺陷...
在 C 中,通常会注册一个处理程序来保护可能失败的代码片段。您处理异常的方式取决于您的 OS(即在 windows 下,您可以将可能失败的代码包装在异常处理程序 __try __except
中)。