如何检测C中的变量uninitialized / catch段错误

我目前有一个程序,我需要测试作为参数传入的变量是否未初始化。 到目前为止,似乎在C中这很难做到,所以我的下一个想法是调用信号处理程序来捕获段错误。 但是,我的代码在尝试访问未初始化的变量时没有调用信号处理程序,如下所示:

void segfault_sigaction(int signal, siginfo_t *si, void *arg) { printf("Caught segfault at address %p\n", si->si_addr); exit(0); } void myfree(void*p, char * file, int line){ struct sigaction sa; memset(&sa, 0, sizeof(sigaction)); sigemptyset(&sa.sa_mask); sa.sa_sigaction = segfault_sigaction; sa.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); char up = *((char*)p); //Segfault 

编辑:在Linux系统上

这不是一个好主意。 如果程序试图使用未初始化的变量,那么它总是一个bug。 找到这个错误的正确方法是使用一个好的编译器,启用所有警告,或者更好的静态分析工具。 在程序开发时应该找到并修复bug。 不在运行时。

此外,通过良好的程序设计,调用者负责将正确的参数传递给函数。 该函数根本不需要关注调用者本身。 如果通过引用传递了错误的参数,则所有投注都将关闭。

访问未初始化指针指向的内存会导致未定义的行为,其中包括以下结果:

  • 存在分段错误。
  • 程序崩溃了。
  • 没有任何事情发生,但程序开始表现得很奇怪。
  • 什么都没发生,程序似乎工作得很好。

如果你这样做是因为你想要防御性编程,你应该考虑对变量值进行某种forms的检查,最好是通过assert()或static_assert()。

尝试使用Valgrind和memcheck工具。 它可以检测未初始化的内存访问以及许多其他无效访问模式。 可以在这里找到教程。 添加–track-origins = yes参数(需要版本3.4.0)可以更容易地找到未初始化内存的使用。

如果您没有初始化它,则指针没有默认值。 有时它是NULL (如果pNULL ,你可以捕获SIGSEGV ),有时它指向一个有效的内存,似乎一切正常。 他们拥有的价值就是他们现在使用的内存中的垃圾。 至于你的问题,我建议编写你自己的malloc()free() ,给分配内存的标题添加一个幻数,并测试它在释放时是否仍然存在。