0

我正在尝试运行会产生分段错误的代码。但是不会产生分段错误。

int main()
{

char *variable;

strcpy(variable,"hello");

}

程序崩溃,但没有显示消息称发生了分段违规。

即使我编写了一个信号处理程序来处理分段错误,信号也没有被捕获。

你知道为什么会这样吗?内核对 SIGSEGV 信号的处理是否有可能被禁用或其他什么...

谢谢,

4

2 回答 2

1

就我而言,分段错误是使用 gcc 编译器来的(输出:分段错误)。但是,如果在您的情况下它没有出现,请尝试使用 strace 运行您的二进制文件,例如 strace ./a.out(say)。它将显示在控制台上执行的系统级命令。也许你会从中得到一个想法

于 2012-07-20T05:04:20.883 回答
0

首先,你真的应该养成使用gcc -Wallwhich 来警告此类错误的编译习惯。

要了解真正发生了什么,请使用调试器,例如gdb逐步运行您的代码。您也可以使用straceor 更好ltrace (这将显示 的论点strcpy)。

那么,一个可能的解释(只是猜测)可能如下:

  • variable的未初始化

  • 因此它保留了寄存器(或堆栈槽)存储的“值variable

  • main被调用crt0.o,碰巧用有意义的东西(一个有效的指针)初始化那个位置,也许argv[0]main 某个 shell 环境变量

(您可以阅读有关x86-64 ABI的更多信息以了解如何crt0.o设置堆栈)

如果你初始化variable=NULL; 你会得到一个SIGSEGV

于 2012-07-20T05:04:34.567 回答