Статический анализатор PVS-Studio сообщает, что в nh = (struct nlmsghdr *) buf
,
Указатель 'buf' преобразуется в более строго выровненный тип указателя.
Я думаю, что предупреждение правильное. Это серьезная проблема? Код должен быть переносимым на различные архитектуры. Как я могу это исправить?
Я знаю несколько способов:
- выделить буфер в куче;
- использовать функции stdalign, но они не C99,
- cmsghdr API использует объединение для обработки выравнивания, но я не уверен, что netlink это делает.
Есть ли другой вариант?
Приведенный ниже код взят с справочной страницы netlink.
int len;
char buf[8192]; /* 8192 to avoid message truncation on
platforms with page size > 4096 */
struct iovec iov = { buf, sizeof(buf) };
struct sockaddr_nl sa;
struct msghdr msg;
struct nlmsghdr *nh;
msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
len = recvmsg(fd, &msg, 0);
for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len);
nh = NLMSG_NEXT (nh, len)) {
/* The end of multipart message */
if (nh->nlmsg_type == NLMSG_DONE)
return;
if (nh->nlmsg_type == NLMSG_ERROR)
/* Do some error handling */
...
/* Continue with parsing payload */
...
}
Спасибо.
char
чем-то другим. Просто погуглитеSIGBUS
arm илиSIGBUS
sparc. - person Andrew Henle   schedule 01.09.2019