首先,我們來看看爲什麼會出現鋸齒違規警告。
別名規則簡單地說,你只能通過自身的類型,它的符號/無符號變量類型訪問對象,或通過字符類型(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);
您可以通過訪問unsigned int
的outgoing_buf
的char
元素,所以它是一個別名衝突。
提出的解決方案
要解決你的問題,你可以嘗試有您要訪問您的陣列的類型直接定義的元素:
unsigned int incoming_buf[LIBIRC_DCC_BUFFER_SIZE/sizeof (unsigned int)];
unsigned int outgoing_buf[LIBIRC_DCC_BUFFER_SIZE/sizeof (unsigned int)];
(通過寬度的方式unsigned int
是實現定義的,因此如果程序假設unsigned int
是32位,則應考慮使用uint32_t
)。
這種方式,您可以存儲陣列中unsigned int
對象,而不通過類型char
訪問的元素,像這樣違反別名規則:
*((char *) outgoing_buf) = expr_of_type_char;
或
char_lvalue = *((char *) incoming_buf);
編輯:
我完全重寫了我的答案,特別是我解釋了程序爲什麼會從編譯器獲取別名警告。
有趣...嚴格別名不應該適用於'char *'。或者我錯過了什麼? – Mysticial 2012-01-11 18:30:14
@Mysticial是的,你所錯過的是,當'T1'類型的對象用'T2'類型的左值和'T2'爲'char'訪問時,沒有別名違規,但當'T1'是'char '和'T2'不是'char'的有符號/無符號變體,則存在混疊違規。 – ouah 2012-01-11 19:08:49
@ouah你應該做出答案。 – Mysticial 2012-01-11 19:11:19