First off, let's examine why you get the aliasing violation warnings.
Aliasing rules simply say that you can only access an object through
its own type, its signed / unsigned variant type, or through a character type (char
, signed
char
, unsigned
char
).
C says violating aliasing rules invokes undefined behavior (so don't!).
In this line of your program:
unsigned int received_size = ntohl (*((unsigned int*)dcc->incoming_buf));
although the elements of the incoming_buf
array
are of type char
,
you are accessing them as unsigned
int
. Indeed the result of the dereference operator in the expression *((unsigned
int*)dcc->incoming_buf)
is of unsigned
int
type.
This is a violation of the aliasing rules, because you only have the right to access elements of incoming_buf
array
through (see rules summary above!) char
, signed
char
or unsigned
char
.
Notice you have exactly the same aliasing issue in your second culprit:
*((unsigned int*)dcc->outgoing_buf) = htonl (dcc->file_confirm_offset);
You access the char
elements
of outgoing_buf
through unsigned
int
, so it's an aliasing violation.
Proposed solution
To fix your issue, you could try to have the elements of your arrays directly defined in the type you want to access:
unsigned int incoming_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
unsigned int outgoing_buf[LIBIRC_DCC_BUFFER_SIZE / sizeof (unsigned int)];
(By the way the width of unsigned
int
is implementation defined, so you should consider using uint32_t
if
your program assumes unsigned
int
is 32-bit).
This way you could store unsigned
int
objects in your array without violating the aliasing rules by accessing the element through the type char
,
like this:
*((char *) outgoing_buf) = expr_of_type_char;
or
char_lvalue = *((char *) incoming_buf);