Naohiro Aota
nao.a****@gmail*****
2008年 7月 20日 (日) 00:29:33 JST
青田です。 linux kernel の vanilla source に TOMOYO 1.6.3 の patch をあてたものを Gentoo の x86_64-pc-linux-gnu-gcc-4.3.1 でコンパイルしたところ以下のよう なエラーが出て止まってしまいました。 CC fs/tomoyo_network.o fs/tomoyo_network.c: In function ‘save_ipv6_address’: fs/tomoyo_network.c:79: 警告: statement with no effect fs/tomoyo_network.c:79: 警告: statement with no effect fs/tomoyo_network.c:79: 警告: statement with no effect fs/tomoyo_network.c:79: 警告: statement with no effect fs/tomoyo_network.c:65: internal compiler error: セグメンテーション違反です 完全なバグ報告を送って下さい。 適切ならばプリプロセス後のソースをつけてください。 <http://bugs.gentoo.org/> を見れば方法が書いてあります。 make[1]: *** [fs/tomoyo_network.o] エラー 1 make: *** [fs] エラー 2 また、 x86_64-pc-linux-gnu-gcc-4.2.4 では止まりはしなかったものの同様の警 告が出ました。 おそらく gcc のバグだろうと調べてみたところ 1 int main(void) 2 { 3 static const int size = 16; 4 struct structA { 5 int foo[size]; 6 }; 7 struct structB { 8 int foo[16]; 9 }; 10 struct structA *ptrA; 11 struct structB *ptrB; 12 13 ptrA = (typeof(*ptrA) *) 0x12345; 14 ptrB = (typeof(*ptrB) *) 0x67890; 15 16 ptrA = ({ (typeof(*ptrA) *) 0x12345; }); 17 ptrB = ({ (typeof(*ptrB) *) 0x67890; }); 18 19 return 0; 20 } このような test.c をコンパイルすると以下のように出力されることがわかりま した。 % gcc -Wall test.c test.c: In function ‘main’: test.c:16: 警告: statement with no effect おそらく gcc のミスで ({}) の中で const を配列の大きさとしてとる配列を含 む構造体の typeof がとれなくなっているのではないかと思います。 警告が出ていても特に実害はなく、コンパイルできないのも gcc のせいなのです が、一応最新の gcc でコンパイルが通らないというのは落ち着かないので、とり あえず Gentoo 用に以下のようなパッチをあててもかまいませんか? また、この問題は他の環境でも起こるのでしょうか? よろしければ追試をお願い します。 --- tomoyo_network.c~ 2008-07-20 00:14:26.000000000 +0900 +++ tomoyo_network.c 2008-07-20 00:14:57.000000000 +0900 @@ -65,7 +65,7 @@ { static const u8 block_size = 16; struct addr_list { - struct in6_addr addr[block_size]; + struct in6_addr addr[16]; struct list1_head list; u32 in_use_count; }; -- 青田