Прежде всего, давайте рассмотрим, почему вы получаете предупреждения о нарушении алиасинга.
Правила алиасинга просто говорят, что вы можете получить доступ к объекту только через его собственный тип, его вариантный вариант со знаком или без знака.или через символьный тип (char
, signed char
, unsigned char
).
C говорит, что нарушение правил наложения имен вызывает неопределенное поведение (, поэтому не надо! ).
В этой строке вашей программы:
unsigned int received_size = ntohl (*((unsigned int*)dcc->incoming_buf));
, хотя элементы массива incoming_buf
имеют тип char
, вы обращаетесь к ним как unsigned int
.Действительно, результат оператора разыменования в выражении *((unsigned int*)dcc->incoming_buf)
имеет тип unsigned int
.
Это нарушение правил наложения имен, поскольку у вас есть право только для доступа к элементам массива incoming_buf
через (см. Сводку правил выше!) char
, signed char
или unsigned char
.
Обратите внимание, что у вашего второго виновника точно такая же проблема с алиасами:
*((unsigned int*)dcc->outgoing_buf) = htonl (dcc->file_confirm_offset);
Вы получаете доступ к char
элементам от outgoing_buf
до unsigned int
, так что это нарушение алиасинга.
Предлагаемое решение
Чтобы устранить проблему, вы можете попытаться задать элементы ваших массивов, прямо определенные в типе, к которому вы хотите получить доступ:
unsigned int incoming_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
unsigned int outgoing_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
(Кстати, ширина unsigned int
определяется реализацией, поэтому вы должны рассмотреть возможность использования uint32_t
, если ваша программа предполагает, что unsigned int
является 32-битной).
Таким образом, вы можете хранить unsigned int
объектов в вашем массиве без нарушения правил наложения имен путем доступа к элементу через тип char
, например:
*((char *) outgoing_buf) = expr_of_type_char;
или
char_lvalue = *((char *) incoming_buf);
РЕДАКТИРОВАТЬ:
Я полностью переработал мой ответ, в частности, я explПоэтому программа получает предупреждения о псевдонимах от компилятора.