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);
EDIT:
I've entirely reworked my answer, in particular I explain why the program gets the aliasing warnings from the compiler.