memcachedをgcc4.5.0でmakeするとエラー
memcachedをconfigure,makeするとこんなエラーが。
$ make make all-recursive (中略) gcc -std=gnu99 -DHAVE_CONFIG_H -I. -DNDEBUG -g -O2 -pthread -Wall -Werror -pedantic -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -MT memcached-memcached.o -MD -MP -MF .deps/memcached-memcached.Tpo -c -o memcached-memcached.o `test -f 'memcached.c' || echo './'`memcached.c cc1: warnings being treated as errors memcached.c: In function 'complete_incr_bin': memcached.c:1023:16: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c:1044:13: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c:1061:17: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c: In function 'process_bin_get': memcached.c:1193:9: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c: In function 'process_bin_update': memcached.c:1889:5: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c:1905:5: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c: In function 'process_bin_append_prepend': memcached.c:1949:5: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c: In function 'process_bin_delete': memcached.c:2014:9: error: dereferencing type-punned pointer will break strict-aliasing rules memcached.c: In function 'do_store_item': memcached.c:2127:9: error: dereferencing type-punned pointer will break strict-aliasing rules (後略)
手持ちの環境でgccのそれぞれ4.1.2,3.4.3で試してみたけれど、エラーにはならない。
該当ソースはたとえばこんなところ。
ITEM_set_cas(it, c->binary_header.request.cas);
このITEM_set_cas()または、ITEM_get_cas()というマクロを使っているところで上記のエラーがでています。
このマクロはmemcached.hで定義されています。
#define ITEM_get_cas(i) ((uint64_t)(((i)->it_flags & ITEM_CAS) ? \ *(uint64_t*)&((i)->end[0]) : 0x0)) #define ITEM_set_cas(i,v) { if ((i)->it_flags & ITEM_CAS) { \ *(uint64_t*)&((i)->end[0]) = v; } }
うーん、多分型が違うポインタへキャストしてつかっているところがまずいのかな。4.5から仕様がかわったのか、それともチェックが厳しくなっただけなのか。
通常ならwarningですんでるはずが、-Werrorがついてるからエラー扱いになって、コンパイルが中断されてしまっています。
仕方ないので、configureファイルを書き換えて、-Werrorを外して再configure,make。
$ diff configure configure.bak 7917c7917 < CFLAGS="$CFLAGS -Wall -pedantic -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls" --- > CFLAGS="$CFLAGS -Wall -Werror -pedantic -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls"
まぁ、無事にmakeはできたんだけど使ってて平気かなって気にはなる。