valgrind работает на struct sockaddr_nl - PullRequest
0 голосов
/ 14 мая 2018

Я думаю, что общая схема программирования сокетов для отправки сообщений:

static const struct sockaddr_nl snl = {
   .nl_family = AF_NETLINK
};
return sendto(nl->fd, buf, len, 0, (struct sockaddr *) &snl, sizeof(snl));

, где struct sockaddr_* зависит от типа сокета. Приведенный выше код вызывает valgrind жалобу:

Syscall param socketcall.sendto(msg) points to uninitialised byte(s)

Это очевидно, потому что остальные члены struct sockaddr_nl не инициализированы.

Вот как это выглядит в моей системе (Ubuntu 16.04):

struct sockaddr_nl {
        __kernel_sa_family_t    nl_family;      /* AF_NETLINK   */
        unsigned short  nl_pad;         /* zero         */
        __u32           nl_pid;         /* port ID      */
        __u32           nl_groups;      /* multicast groups mask */
};

Так что мой вопрос - безопасно ли инициализировать nl_pid и nl_groups в ноль в случае операции sendto()?

1 Ответ

0 голосов
/ 15 мая 2018

valgrind жалуется на то, что аргумент msg содержит неинициализированные байты, а не snl.Это память, на которую указывает buf, которая содержит неинициализированные байты.

Вы можете использовать --track-originins = yes, чтобы подтвердить, где были созданы неинициализированные байты.

...