sigaction не инициализирован gcc 7 - PullRequest
0 голосов
/ 14 октября 2019

Позвольте быть этим 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 имеют одинаковые адреса.

1 Ответ

0 голосов
/ 14 октября 2019

struct sigaction action не инициализируется ни в одном из компиляторов. Вы устанавливаете action.sa_handler, но все остальные поля остаются неинициализированными. Начиная с gcc-7, компилятор достаточно умен, чтобы заметить, что вы только инициализировали некоторые поля структуры, оставляя другие неинициализированными. Gcc-5 просто не такой умный, но это не значит, что структура когда-либо была инициализирована. То, что вы видите в action.sa_flags, это просто любой мусор, оставленный в стеке из кода crt0 до вызова main.

Хотя это технически неверно для указателей в структурах, общее решение этого заключается в memset () structдо 0.

...