Trước hết, hãy xem xét lý do tại sao bạn nhận được cảnh báo vi phạm bí danh.
quy tắc Aliasing chỉ đơn giản nói rằng bạn chỉ có thể truy cập vào một đối tượng thông qua kiểu riêng của mình, ký/unsigned loại biến thể của nó, hoặc thông qua một loại nhân vật (char
, signed char
, unsigned char
).
C cho biết vi phạm quy tắc bí danh gọi hành vi không xác định (vì vậy đừng!).
Trong dòng này của chương trình của bạn:
unsigned int received_size = ntohl (*((unsigned int*)dcc->incoming_buf));
mặc dù các yếu tố của mảng incoming_buf
là loại char
, bạn đang truy cập chúng như unsigned int
. Thật vậy, kết quả của toán tử dereference trong biểu thức *((unsigned int*)dcc->incoming_buf)
là loại unsigned int
.
Điều này vi phạm quy tắc bí danh vì bạn chỉ có quyền truy cập các thành phần của incoming_buf
mảng qua (xem tóm tắt quy tắc ở trên!) char
, signed char
hoặc unsigned char
.
Chú ý bạn có chính xác cùng một vấn đề răng cưa ở thủ phạm thứ hai của bạn:
*((unsigned int*)dcc->outgoing_buf) = htonl (dcc->file_confirm_offset);
Bạn truy cập vào char
yếu tố của outgoing_buf
qua unsigned int
, vì vậy nó là một vi phạm răng cưa.
giải pháp đề xuất
Để khắc phục vấn đề của bạn, bạn có thể thử để có các yếu tố của mảng của bạn được xác định trực tiếp trong các loại hình bạn muốn truy cập:
unsigned int incoming_buf[LIBIRC_DCC_BUFFER_SIZE/sizeof (unsigned int)];
unsigned int outgoing_buf[LIBIRC_DCC_BUFFER_SIZE/sizeof (unsigned int)];
(Bằng cách chiều rộng của unsigned int
được thực hiện xác định, vì vậy bạn nên cân nhắc sử dụng uint32_t
nếu chương trình của bạn giả định unsigned int
là 32-bit).
Bằng cách này bạn có thể lưu trữ unsigned int
đối tượng trong mảng của bạn mà không vi phạm các quy tắc răng cưa bằng cách truy cập phần tử thông qua các loại char
, như thế này:
*((char *) outgoing_buf) = expr_of_type_char;
hoặc
char_lvalue = *((char *) incoming_buf);
CHỈNH SỬA:
Tôi đã hoàn toàn làm lại câu trả lời của mình, đặc biệt tôi giải thích lý do tại sao chương trình nhận được cảnh báo bí danh từ trình biên dịch.
Thú vị ... bí danh nghiêm ngặt không được áp dụng cho 'char *'. Hay tôi đang thiếu một cái gì đó? – Mysticial
@Mysticial Vâng, những gì bạn đang thiếu là không có sự vi phạm răng cưa khi một đối tượng kiểu 'T1' được truy cập với một giá trị của kiểu' T2' và 'T2' là' char', nhưng khi 'T1' là' char 'và' T2' không phải là một biến thể được ký/unsigned của 'char', có một sự vi phạm răng cưa. – ouah
@ouah Bạn nên làm cho câu trả lời đó. – Mysticial