ошибка: позиционная инициализация поля в «struct», объявленной с атрибутом «selected_init» [-Werror = обозначенный-init] - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь настроить старый модуль ядра (написанный для ядра 2.6.x) для ядра 4.6.x.

Код имеет объявление структуры, как показано ниже:

struct tcpsp_sysctl_table {
    struct ctl_table_header *sysctl_header;
    struct ctl_table tcpsp_vars[NET_TCPSP_LAST];
    struct ctl_table tcpsp_dir[2];
    struct ctl_table root_dir[2];
};

Инициализация структуры записывается как:

static struct tcpsp_sysctl_table tcpsp_table = {
        NULL,
        {{NET_TCPSP_TO_ES, "timeout_established",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_ESTABLISHED],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_SS, "timeout_synsent",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_SYN_SENT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_SR, "timeout_synrecv",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_SYN_RECV],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_FW, "timeout_finwait",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_FIN_WAIT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_TW, "timeout_timewait",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_TIME_WAIT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_CL, "timeout_close",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_CLOSE],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_CW, "timeout_closewait",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_CLOSE_WAIT],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_LA, "timeout_lastack",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_LAST_ACK],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_LI, "timeout_listen",
        &tcpsp_timeout_tbl.timeout[TCPSP_S_LISTEN],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_TO_SA, "timeout_synack",
          &tcpsp_timeout_tbl.timeout[TCPSP_S_SYNACK],
          sizeof(int), 0644, NULL, &proc_dointvec_jiffies},
         {NET_TCPSP_DEBUG_LEVEL, "debug_level",
          &sysctl_tcpsp_debug_level, sizeof(int), 0644, NULL,
          &proc_dointvec},
         {0}},
        {{NET_TCPSP, "tcpsp", NULL, 0, 0555, tcpsp_table.tcpsp_vars},
         {0}},
        {{CTL_NET, "net", NULL, 0, 0555, tcpsp_table.tcpsp_dir},
         {0}}
    };

Когда я компилирую модули, я получаю ошибку, связанную с этими строками кода:

Ошибка: позиционная инициализация поля в'struct' объявлена ​​с атрибутом обозначено_init [-Werror = обозначено-init]
{{NET_TCPSP_TO_ES, "timeout_established",

Это связано с новым программированием в стиле C или существуетлюбая проблема синтаксиса.Я не могу понять, что происходит.

1 Ответ

3 голосов
/ 19 марта 2019

struct ctl_table теперь подчиняется рандомизированной структуре структуры. Это означает, что инициализаторы для таких структур должны использовать обозначенные инициализаторы - это инициализаторы, которые явно называют каждое поле в структуре. Поля в struct ctl_table также изменились с версии ядра, для которой был написан код - начальный элемент ctl_name больше не существует.

Вы можете обновить его так:

static struct tcpsp_sysctl_table tcpsp_table = {
        NULL,
        {{/* NET_TCPSP_TO_ES */
          .procname = "timeout_established",
          .data = &tcpsp_timeout_tbl.timeout[TCPSP_S_ESTABLISHED],
          .maxlen = sizeof(int),
          .mode = 0644,
          .child = NULL,
          .proc_handler = &proc_dointvec_jiffies},
         {/* NET_TCPSP_TO_SS */
          .procname = "timeout_synsent",
          .data = &tcpsp_timeout_tbl.timeout[TCPSP_S_SYN_SENT],
          .maxlen = sizeof(int),
          .mode = 0644,
          .child = NULL,
          .proc_handler = &proc_dointvec_jiffies},
        /* ... */
...