c - sigaction 未初始化 gcc 7

标签 c gcc structure sigaction

假设是这个 C 文件:

#include <stdio.h>
#include <signal.h>

void handle(){
    return;
}

int main() {
    struct sigaction action;
    action.sa_handler = &handle;
    printf("%d\n", action.sa_flags);
    return 0;
}

使用 gcc-7 (Ubuntu 7.4.0-1ubuntu1~18.04.1) 编译会抛出警告:

src/flags.c:14:2: warning: ‘action.sa_flags’ is used uninitialized in this function [-Wuninitialized]
  printf("%d\n", action.sa_flags);

但是,使用gcc-5(Ubuntu 5.4.0-6ubuntu1~16.04.11),没有警告。

使用 gcc-7,sa_flags 值实际上未初始化:

(gdb) x action.sa_flags
0x555545a0:    Cannot access memory at address 0x555545a0

使用 gcc-5,它会得到一个奇怪的值:

(gdb) x action.sa_flags
0x4004a0 <_start>:    0x8949ed31

我不明白为什么:

  • 对于 gcc-7,sa_flags 未初始化为 0。
  • 对于 gcc-5,sa_flags_start 函数具有相同的地址。

最佳答案

struct sigaction action 未在任一编译器中初始化。您设置了 action.sa_handler 但所有其他字段仍保持未初始化状态。从 gcc-7 开始,编译器足够聪明,可以注意到您只初始化了结构的某些字段,而其他字段未初始化。 Gcc-5 根本就没有那么智能,但这并不意味着该结构已被初始化。您在 action.sa_flags 中看到的只是调用 main 之前 crt0 代码留在堆栈上的任何垃圾。

尽管结构中的指针在技术上是错误的,但一般的解决方案是将结构 memset() 为 0。

关于c - sigaction 未初始化 gcc 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58378233/

相关文章:

c - 如何访问按值传递给函数的结构数组中的成员?

C 结构到结构赋值 - 目标结构中的值不正确

c - 私有(private)定义结构的公共(public) sizeof

c - 如何在C中打印\\? (fprintf)

c - 格式 '%lf' 需要类型为 'double' 的参数,但参数 2 的类型为 'double *'

c++ - 如何在 mingw 上安装 nasm 以使用 pjsip 库为 Windows 应用程序构建 openh264 库

挑战: Calculate transfer rate via UDP socket

c++ - 在执行期间检测下溢

macos - 海湾合作委员会警告 : implicit declaration of function 'puts' is invalid in C99

c# - 每层的 MVVM 角色