anet.oanet.c: In function ‘anetSockName’:anet.c:623: warning: dereferencing pointer ‘s’ does break strict-aliasing rulesanet.c:621: note: initialized from hereanet.c:627: warning: dereferencing pointer ‘s’ does break strict-aliasing hereanet.c: In function ‘anetPeerToString’:anet.c:584: warning: dereferencing pointer ‘s’ does break strict-aliasing rulesanet.c:582: note: initialized from hereanet.c:588: warning: dereferencing pointer ‘s’ does break strict-aliasing rulesanet.c:553: note: initialized from hereanet.c:559: warning: dereferencing pointer ‘s’ does break strict-aliasing
2.gcc 4.4下如果在编译swoole的时候(即make阶段),出现gcc warning dereferencing pointer ‘v.327’ does break strict-aliasing rules、dereferencing type-punned pointer will break strict-aliasing rules 请手动编辑Makefile,将CFLAGS
dict.o anet.c: In function ‘anetSockName’: anet.c:565: warning: dereferencing pointer ‘s’ does break strict-aliasing rules anet.c:563: note: initialized from here anet.c:569: warning: dereferencing pointer ‘s’ does break strict-aliasing rules anet.c:541: note: initialized from here anet.c:547: warning: dereferencing pointer ‘s’ does break strict-aliasing here anet.c: In function ‘anetTcpAccept’: anet.c:511: warning: dereferencing pointer ‘s’ does break strict-aliasing rules anet.c:509: note: initialized from here anet.c:515: warning: dereferencing pointer ‘s’ does break strict-aliasing
%x\n", s); return 0; } 然而,下列用法仍然是不安全的(多版本gcc实测正常,也未有“dereferencing type-punned pointer will break strict-aliasing
anet.o anet.c: In function ‘anetSockName’: anet.c:640: warning: dereferencing pointer ‘s’ does break strict-aliasing rules anet.c:638: note: initialized from here anet.c:644: warning: dereferencing pointer ‘s’ does break strict-aliasing here anet.c: In function ‘anetPeerToString’: anet.c:584: warning: dereferencing pointer ‘s’ does break strict-aliasing rules anet.c:582: note: initialized from here anet.c:588: warning: dereferencing pointer ‘s’ does break strict-aliasing here anet.c: In function ‘anetTcpAccept’: anet.c:555: warning: dereferencing pointer ‘s’ does break strict-aliasing
效果如下所示: FF_CFLAGS="-O3 -Wall -pipe -std=c99 -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi
anet.o anet.c: In function ‘anetSockName’: anet.c:640: warning: dereferencing pointer ‘s’ does break strict-aliasing rules anet.c:638: note: initialized from here anet.c:644: warning: dereferencing pointer ‘s’ does break strict-aliasing here anet.c: In function ‘anetPeerToString’: anet.c:584: warning: dereferencing pointer ‘s’ does break strict-aliasing rules anet.c:582: note: initialized from here anet.c:588: warning: dereferencing pointer ‘s’ does break strict-aliasing here anet.c: In function ‘anetTcpAccept’: anet.c:555: warning: dereferencing pointer ‘s’ does break strict-aliasing
原因是加了-O2选项,默认打开了-strict-aliasing,程序中的short *p = (short *) &i, 破坏了aliasing 规则,编译器不会认为short 型指针p 指向 整形&
*) set strict-aliasing -fno-strict-aliasing eval $checkccflag@@ -5245,7 +5257,7 @@
function 'void Foo::set(short int)': test.cpp:23:14: warning: dereferencing type-punned pointer will break strict-aliasing
这里大小不是0,稍后分析 static _Rep& _S_empty_rep() _GLIBCXX_NOEXCEPT { // NB: Mild hack to avoid strict-aliasing