アカウント名:
パスワード:
良く分からないなぁ。
struct sock *sk = tun->sk;
tun が NULL なら tun->sk を参照した時点で落ちるんじゃないの?その時点で後ろの if ブロックが削られようが削られまいが何も問題ないと思うんだけど。それとも sk のオフセットはメモリアクセスできちゃうエリアに到達するほど大きい値?
struct sock *sk = &tun->sk;
なら分からないでもないけど、それだとGCCの問題な気が・・・
すいません、自己解決。カーネルなら tun が NULL でも tun->sk を参照しても落ちるわけありませんね。NULL 参照が許されるような環境でそんな最適化を行ってしまう GCC にも問題がある気がします。
シロウトの印象だと、必要な処理をすっ飛ばしちゃうGCCの最適化手法がおかしいんだろうとは思うんですが、ソースコードベースでソフトウェアを公開するとなるとけっこうめんどくさい問題ですね、これ。
GCCの挙動がもし「仕様」(速いコードを吐く代わりに妙なところで命令をすっ飛ばすことがある)だとしたら、コンパイラやコンパイルオプションを選んだ人にも問題がないわけでもなく、でもそうすると「選んだ人」って誰ということにもなり、あとはリリースエンジニアリング的なトコにもツッコミどころがあるのかなとか、いろいろ考えられますよね。
でも少なくとも心情的には「コードが間違ってる」とは言いがたいなあ。
通常のユーザープロセスで動かす分には、最近の環境ならNULLアクセスしたら大抵トラップ食らってプログラム終了ですから、そういう前提 (NULLアクセスしたらカーネルが止めてくれる) で最適化している可能性はあるかも。
カーネルコードとか組込み機器とかでは、そもそもNULLアクセスで止まる保証がないわけで、そんなところでGCCの最適化を盲目的に適用するのは危険という教訓になるんですかね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
Stableって古いって意味だっけ? -- Debian初級
バグ?仕様? (スコア:1, 参考になる)
Re: (スコア:1, 興味深い)
良く分からないなぁ。
tun が NULL なら tun->sk を参照した時点で落ちるんじゃないの?
その時点で後ろの if ブロックが削られようが削られまいが何も問題ないと思うんだけど。
それとも sk のオフセットはメモリアクセスできちゃうエリアに到達するほど大きい値?
なら分からないでもないけど、それだとGCCの問題な気が・・・
Re: (スコア:0)
すいません、自己解決。カーネルなら tun が NULL でも tun->sk を参照しても落ちるわけありませんね。
NULL 参照が許されるような環境でそんな最適化を行ってしまう GCC にも問題がある気がします。
どこが問題か考えるとちょっと複雑 (スコア:1, 興味深い)
シロウトの印象だと、必要な処理をすっ飛ばしちゃうGCCの最適化手法が
おかしいんだろうとは思うんですが、ソースコードベースで
ソフトウェアを公開するとなるとけっこうめんどくさい問題ですね、これ。
GCCの挙動がもし「仕様」(速いコードを吐く代わりに妙なところで命令を
すっ飛ばすことがある)だとしたら、コンパイラやコンパイルオプションを選んだ人にも
問題がないわけでもなく、でもそうすると「選んだ人」って誰ということにもなり、
あとはリリースエンジニアリング的なトコにもツッコミどころがあるのかなとか、
いろいろ考えられますよね。
でも少なくとも心情的には「コードが間違ってる」とは言いがたいなあ。
Re:どこが問題か考えるとちょっと複雑 (スコア:2)
通常のユーザープロセスで動かす分には、最近の環境ならNULLアクセスしたら大抵トラップ食らってプログラム終了ですから、そういう前提 (NULLアクセスしたらカーネルが止めてくれる) で最適化している可能性はあるかも。
カーネルコードとか組込み機器とかでは、そもそもNULLアクセスで止まる保証がないわけで、そんなところでGCCの最適化を盲目的に適用するのは危険という教訓になるんですかね。
Re: (スコア:0)
ヌル参照はANSI Cでは未定義になっているわけです。今回の話も仕様に従った正しい動作です。
gccの最適化により潜在的なバグが顕在化したということですから、gccを責めるのはお門違いです。