文脈がわからず間違ったことを言っていたらすみません。 >仕様の穴をどうにかしろって事 これは、C言語のということでしょうか? であれば、C言語の仕様として、「不定」であると規定されているので、不定なコードを書いている以上、どのように振る舞っても問題ないと思います。 他の方が引用しているように、 http://www.spec.org/cpu2006/Docs/faq.html#Run.05 [spec.org] SPEC にある > Although the code pattern does not follow the C99 standard (See section 6.5.6/8), it is at minimum arguable that the code fragment is compliant under the C89 stan
gccの初物は危なすぎっていうか… (スコア:-1)
リリースされるや否やSPEC 2006ベンチをコンパイルするとぶっ壊れたコード吐く [lwn.net]って騒ぎになってるのに、あえてそちらはスルーして
このタレコミ人が突っ込んだ-O3 -ffast-mathつけると結果が変わるぞゴラァ [gnu.org]とかいう話の方を取り上げて「バグもすぐ直してくれる」とか結んじゃうんだ…
凄えなこのタレコミ人・・・・・・・
某ドラッカーじゃないけど、もうちょっと真摯にタレコミしてくれないもんかね
# 「gccって-O3 -ffast-mathつけてビルドして結果が変わったらバグ扱いにしてくれるんだってよ」ってGentoo使いに教えてやりたいね(笑)
Re: (スコア:0)
Fortranは規格違反のコード書いたら鼻から悪魔が出てもいいなんて頭おかしい仕様じゃないから(むしろそんなのはC/C++くらいだろ)。
Re: (スコア:0)
そこまで解析して最適化するなら、もうちょっと先まで解析してよとは思いますね
※昔は無意味なループ削除とかやらなかったのに…ストールマン曰く「プログラマーは無意味なループを書かない」、今回の最適化はここからかけ離れてますね
Re: (スコア:0)
ループは削除してないし
while (1) {
f();
if (p()) break;
g();
}
みたいなコードで毎回1と0を比べて欲しいのかい
Re: (スコア:0)
ループ削除は例です
現実的にwhile(1)じゃないコードをwhile(1)扱いしてるのが問題なわけで
Re: (スコア:1)
規格に則っていない以上、どう解釈されても文句は言えないでしょ。
GCCは、配列a[n]のn番目のアクセスしなくていいよう辻褄を合わせただけ。n番目にアクセスしないならi<nの判定式は必要ない。
プログラマーは、別の方法でループを抜ける方法を実装できるわけだし、実際している場合もある、その場合判定は2つも要らない。。
Re:gccの初物は危なすぎっていうか… (スコア:0)
フェイルセーフにしなかったって事ですね
まあ仕様の穴をどうにかしろって事なんでしょうが、穴のない仕様を作るも結構たいへんですし
実装者の趣味・趣向が問われるところですね
プログラマが不正なアクセスしない事を把握した上でコードを簡易化するために配列を「1」オーバーするコードを書く場合もあると思いますが
Re: (スコア:0)
文脈がわからず間違ったことを言っていたらすみません。
>仕様の穴をどうにかしろって事
これは、C言語のということでしょうか?
であれば、C言語の仕様として、「不定」であると規定されているので、不定なコードを書いている以上、どのように振る舞っても問題ないと思います。
他の方が引用しているように、 http://www.spec.org/cpu2006/Docs/faq.html#Run.05 [spec.org] SPEC にある
> Although the code pattern does not follow the C99 standard (See section 6.5.6/8), it is at minimum arguable that the code fragment is compliant under the C89 stan
Re: (スコア:0)
>プログラマが不正なアクセスしない事を把握した上でコードを簡易化するために配列を「1」オーバーするコードを書く場合もあると思いますが
ありません。というかどうやって把握するのでしょうか?
Re:gccの初物は危なすぎっていうか… (スコア:1)
プログラマが不正なアクセスしない事を把握した上でコードを簡易化するために配列を「1」オーバーするコードを書く場合もあると思いますが
それは元のコードを見た上で言っているのか?
for文の再初期化式の中で、iをインクリメントするのと同時に配列a[i]を変数に代入するなんてことしているから。
iがn以上になった直後に不正なアクセスが発生する。
当然それをプログラマーが理解していないはずはないから。GCCは無限ループと解釈する
それに勘違いしているみたいだけどさ、未定義動作は単なる仕様の穴ではない、
未定義動作が存在するから、コンパイラは強力に最適化を効かせられる面もある。鼻から悪魔が出て来るってのは、その副作用。
http://blog-ja.intransient.info/2011/05/c-13.html [intransient.info]