我试图重现std libc funcs的行为。 积极的情况 - 好的。 否定的情况 - 好的。 但... 我所有的负面案例都给了我" seg fault"而不是"巴士错误" /" abort"。
示例:
void func()
{
...
char str[3] = "nvm";
char str2[3] = "nbd";
strcat(str, str2);
...
}
机器人$>分段错误./ex
{{1}}
机器人$>中止./ex
那么差异" seg fault"和"中止"?我怎样才能中止"我的代码?
答案 0 :(得分:1)
"我怎样才能中止'我的代码"答案很简单:调用abort
中定义的函数stdlib.h
。
"为什么[确实] libc func [给]我' abort'和libmy func [给]我' seg fault'"也有一个简单的答案:在这两种情况下,你都要求库函数执行无效操作; C库具有检测此特定无效操作本身的代码,并调用abort
;您的代码并未尝试检测错误,因此硬件将其作为内存保护"违规,导致操作系统产生致命的分段错误"信号。
我无法告诉你如何制作" libmy func"执行C库所做的事情,因为在ISO C和POSIX中都无法做到这一点。 (在Win32中可能有一种方法,但我不知道它是什么,无论如何,如果你使用的是Windows,你就不会谈论分段错误。)我实际上认为C库是不应该这样做,因为由于太复杂而无法进入这里的原因,即使操作系统扩展超出POSIX,C库完成的检查也不可能准确无误;更好的是它应该将工作留给内存保护硬件,它至少可以是声音(没有误报)。
顺便说一句,"分段错误"之间没有任何有意义的区别。 (SIGSEGV)和"总线错误" (SIGBUS)多年;应用程序代码应该将它们视为等效的,并且如果它需要尝试从两者中恢复(大多数代码都不应该尝试),则应对两种情况使用相同的恢复代码。