在gcc-strict-aliasing-and-casting-of-of-union中,我問是否有人遇到過通過指針進行聯合修剪的問題。到目前為止,答案似乎是否定的。這個問題是廣泛的:你有任何關于gcc和嚴格走樣恐怖故事?背景:引用c99-strict-aliasing-rules-in-c-gcc中AndreyT的答案:“嚴格的別名規則植根于自[標準化]時代以來C和C ++中存在的標準部分。C89/ 90(6.3中存在禁止通過一種類型的左值訪問一種類型的對象的子句。 )以及C ++ 98(3.10 / 15)。...并非所有編譯器都希望(或膽敢)強制執行或依賴它?!焙冒?,海灣合作委員會現在敢于這樣做,它的-fstrict-aliasing開關。這就造成了一些問題。參見,例如,關于Mysql錯誤的出色文章 http://davmac.wordpress.com/2009/10/,以及在http://cellperformance.beyond3d.com/articles/2006/06/understanding上同樣出色的討論-strict-aliasing.html。其他一些不相關的鏈接:Fno嚴格混疊的性能影響嚴格混疊什么時候可以對嚴格的指針別名進行安全處理如何在編譯時檢測嚴格的混疊重復一遍,您是否有自己的恐怖故事?當然,沒有指出的問題-Wstrict-aliasing將是更可取的。也歡迎其他C編譯器。新增6月2日:在第一個環節邁克爾·伯爾的答案,這也的確是有資格作為一個恐怖故事,也許是(2003年)有點過時。我做了一個快速測試,但是問題顯然已經消失了。資源:#include <string.h>struct iw_event { /* dummy! */ int len;};char *iwe_stream_add_event( char *stream, /* Stream of events */ char *ends, /* End of stream */ struct iw_event *iwe, /* Payload */ int event_len) /* Real size of payload */{ /* Check if it's possible */ if ((stream + event_len) < ends) { iwe->len = event_len; memcpy(stream, (char *) iwe, event_len); stream += event_len; } return stream;}具體投訴是:一些用戶抱怨說,如果在沒有-fno-strict-aliasing的情況下編譯[以上]代碼,則寫入和memcpy的順序會顛倒(這意味著將假len復制到流中)。編譯后的代碼,在CYGWIN wih -O3上使用gcc 4.3.4(如果我輸入錯了,請更正我-我的匯編器有點生銹?。篲iwe_stream_add_event: pushl %ebp movl %esp, %ebp pushl %ebx subl $20, %esp movl 8(%ebp), %eax # stream --> %eax movl 20(%ebp), %edx # event_len --> %edx leal (%eax,%edx), %ebx # sum --> %ebx cmpl 12(%ebp), %ebx # compare sum with ends對于邁克爾回答中的第二個鏈接,*(unsigned short *)&a = 4;gcc通常會(總是?)發出警告。但我相信對此(對于gcc)的有效解決方案是使用:#define CAST(type, x) (((union {typeof(x) src; type dst;}*)&(x))->dst)// ...CAST(unsigned short, a) = 4;我問過在gcc-strict-aliasing-and-casting-a-union中這是否可以,但是到目前為止,沒有人不同意。
3 回答

喵喵時光機
TA貢獻1846條經驗 獲得超7個贊
SWIG生成的代碼依賴于嚴格的別名關閉,這可能會導致各種問題。
SWIGEXPORT jlong JNICALL Java_com_mylibJNI_make_1mystruct_1_1SWIG_12(
JNIEnv *jenv, jclass jcls, jint jarg1, jint jarg2) {
jlong jresult = 0 ;
int arg1 ;
int arg2 ;
my_struct_t *result = 0 ;
(void)jenv;
(void)jcls;
arg1 = (int)jarg1;
arg2 = (int)jarg2;
result = (my_struct_t *)make_my_struct(arg1,arg2);
*(my_struct_t **)&jresult = result; /* <<<< horror*/
return jresult;
}
- 3 回答
- 0 關注
- 554 瀏覽
添加回答
舉報
0/150
提交
取消