在gcc-strict-aliasing-and-casting-of-of-union中,我問(wèn)是否有人遇到過(guò)通過(guò)指針進(jìn)行聯(lián)合修剪的問(wèn)題。到目前為止,答案似乎是否定的。這個(gè)問(wèn)題是廣泛的:你有任何關(guān)于gcc和嚴(yán)格走樣恐怖故事?背景:引用c99-strict-aliasing-rules-in-c-gcc中AndreyT的答案:“嚴(yán)格的別名規(guī)則植根于自[標(biāo)準(zhǔn)化]時(shí)代以來(lái)C和C ++中存在的標(biāo)準(zhǔn)部分。C89/ 90(6.3中存在禁止通過(guò)一種類(lèi)型的左值訪問(wèn)一種類(lèi)型的對(duì)象的子句。 )以及C ++ 98(3.10 / 15)。...并非所有編譯器都希望(或膽敢)強(qiáng)制執(zhí)行或依賴它?!焙冒?,海灣合作委員會(huì)現(xiàn)在敢于這樣做,它的-fstrict-aliasing開(kāi)關(guān)。這就造成了一些問(wèn)題。參見(jiàn),例如,關(guān)于Mysql錯(cuò)誤的出色文章 http://davmac.wordpress.com/2009/10/,以及在http://cellperformance.beyond3d.com/articles/2006/06/understanding上同樣出色的討論-strict-aliasing.html。其他一些不相關(guān)的鏈接:Fno嚴(yán)格混疊的性能影響嚴(yán)格混疊什么時(shí)候可以對(duì)嚴(yán)格的指針別名進(jìn)行安全處理如何在編譯時(shí)檢測(cè)嚴(yán)格的混疊重復(fù)一遍,您是否有自己的恐怖故事?當(dāng)然,沒(méi)有指出的問(wèn)題-Wstrict-aliasing將是更可取的。也歡迎其他C編譯器。新增6月2日:在第一個(gè)環(huán)節(jié)邁克爾·伯爾的答案,這也的確是有資格作為一個(gè)恐怖故事,也許是(2003年)有點(diǎn)過(guò)時(shí)。我做了一個(gè)快速測(cè)試,但是問(wèn)題顯然已經(jīng)消失了。資源:#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;}具體投訴是:一些用戶抱怨說(shuō),如果在沒(méi)有-fno-strict-aliasing的情況下編譯[以上]代碼,則寫(xiě)入和memcpy的順序會(huì)顛倒(這意味著將假len復(fù)制到流中)。編譯后的代碼,在CYGWIN wih -O3上使用gcc 4.3.4(如果我輸入錯(cuò)了,請(qǐng)更正我-我的匯編器有點(diǎn)生銹?。篲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對(duì)于邁克爾回答中的第二個(gè)鏈接,*(unsigned short *)&a = 4;gcc通常會(huì)(總是?)發(fā)出警告。但我相信對(duì)此(對(duì)于gcc)的有效解決方案是使用:#define CAST(type, x) (((union {typeof(x) src; type dst;}*)&(x))->dst)// ...CAST(unsigned short, a) = 4;我問(wèn)過(guò)在gcc-strict-aliasing-and-casting-a-union中這是否可以,但是到目前為止,沒(méi)有人不同意。
3 回答

喵喵時(shí)光機(jī)
TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
SWIG生成的代碼依賴于嚴(yán)格的別名關(guān)閉,這可能會(huì)導(dǎo)致各種問(wèn)題。
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 關(guān)注
- 549 瀏覽
添加回答
舉報(bào)
0/150
提交
取消