ошибка: присвоение из несовместимого типа указателя [-Werror = incompatible-pointer-types] - PullRequest
0 голосов
/ 21 марта 2019

Я работаю над модулем ядра Linux.

Структура tcpsp_conn определяется в заголовочном файле следующим образом:

struct tcpsp_conn {
...
struct timer_list timer; /* exp. timer*/
...
};

Затем я объявляю указатель на структуру и пытаюсь назначить функцию:

struct tcpsp_conn *cp;
cp->timer.function = tcpsp_conn_expire;

Функция tcpsp_conn_expire определяется так же, как в struct timer_list ядра:

static void tcpsp_conn_expire(unsigned long data)

Я не понимаю, почему я получаю эту ошибку: ошибка: присвоение из несовместимого типа указателя [-Werror = incompatible-pointer-types] cp-> timer.function = tcpsp_conn_expire;

С типами проблем не возникает.

1 Ответ

1 голос
/ 21 марта 2019

Тип вашей tcpsp_conn_expire функции отличается от типа поля .function структуры timer_list.

В новейшем ядре (начиная с 4.15) это поле функции объявляется с аргументом struct timer_list * вместо unsigned long, как показано ниже:

struct timer_list {
    ...
    void            (*function)(struct timer_list *);
    ...
};

Имея такой аргумент, вы можете получить указатель на структуру struct tcpsp_conn, в которую встроен таймер, с макросом container_of.

...