Прежде всего, давайте разберемся, почему вы получаете предупреждения о нарушении псевдонима.
Правила наложения просто говорят, что вы можете получить доступ к объекту только через его собственный тип, его вариантный тип со знаком / без знака или через символьный тип (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;
or
char_lvalue = *((char *) incoming_buf);
РЕДАКТИРОВАТЬ:
Я полностью переработал свой ответ, в частности, объясняю, почему программа получает предупреждения о псевдониме от компилятора.
person
ouah
schedule
11.01.2012
char*
. Или я что-то упускаю? - person Mysticial   schedule 11.01.2012T1
обращаются с lvalue типаT2
иT2
равноchar
, но когдаT1
равноchar
иT2
не относится к подписанному / неподписанному вариантуchar
, есть нарушение псевдонима. - person ouah   schedule 11.01.2012