`-fstrict-aliasing'
Allows the compiler to assume the strictest aliasing rules
applicable to the language being compiled. For C (and C++), this
activates optimizations based on the type of expressions. In
particular, an object of one type is assumed never to reside at
the same address as an object of a different type, unless the
types are almost the same. For example, an `unsigned int' can
alias an `int', but not a `void*' or a `double'. A character type
may alias any other type. 中略
Enabled at levels `-O2', `-O3', `-Os' と書かれてます。
主要な部分だけ意訳すると、 異なった型のポインタを経由して同じオブジェクトにアクセスする事はないという前提で 最適化を行う。(ただし、似たようなポインタ、int *に対してunsigned int *のような場合、は除く) この最適化オプションは-O2, -O3 -Osで使われる。
素朴な疑問 (スコア:0)
この辺の確認というか保障は誰がしているんでしょうか?
あと確認用のテスト項目リストとかあります?
Re:素朴な疑問 (スコア:4, 参考になる)
たとえば、
#include <stdio.h>
float *conv(int *ptr) { return (float *)ptr; }
int main(int ac, char **av) {
int x = 10;
float *p = conv(&x);
*p = 0.1;
printf("%d\n", x);
return 0;
}
このプログラムは、期待した動作が行われません。
コンパイラの最適化や、コンパイラバージョンに依存したり、周辺
Re:素朴な疑問 (スコア:1, すばらしい洞察)
何を期待しているのか分かりません。解説求む!
Re:素朴な疑問 (スコア:1)
hexで表示するほうがわかりやすいかもしれませんが。
Re:素朴な疑問 (スコア:0)
特定の条件でそういう動作を期待するのは分かりますが、
>コンパイラの最適化や、コンパイラバージョンに依存したり、周辺のコードによっても結果が変わる動きをします。
諸々の要因で結果が違うことは知っているんですよね。
それなのに何か決まった動作を期待するというのは矛盾していませんか?
仕様外の動きを確認して何をしたいのでしょう?
>*p = 0.1;
スタック壊して、mainのリターンと同時にどっか行っちゃう、、、なんて可能性だってあるわけだし :-p
Re:素朴な疑問 (スコア:0)
>テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
って書いてるじゃない。あのコードは正しくないのが前提だよ。
#私も、最初、未定義の動作をさせて何をしたいの? と思ったけど。
Re:素朴な疑問 (スコア:1, すばらしい洞察)
何がしたいのか?ということなんだけどね。
静的なコード解析ツールか何かで、
そういう言語仕様外のコードをチェックするとかなら理解できますけど、
どう動作するか分からないコードを動かして、
「期待どおり」って何が期待どおりなのか?ということだよ。
# 自分だけしか知らない前提があっての「期待どおり」だということは分かりましたけどね。
Re:素朴な疑問 (スコア:0)
>どう動作するか分からないコードを動かして、
>「期待どおり」って何が期待どおりなのか?ということだよ。
元の k.kmn 氏のコメントはそういうことを言っているのだけど理解できませんか。
Re:素朴な疑問 (スコア:1, すばらしい洞察)
流れも理解できない奴にまぬけ呼ばわりされたかねーよ。
>テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
>たとえば
>(省略)
>このプログラムは、期待した動作が行われません。
この文章から「期待した動作」を説明せよ。
という問いに答えられるのは、これを書いた本人だけだよ。
コードは「動作確認するコード」の例。
条件によって動作が異なると自分で説明しているじゃん。
しかし、そのコードがどういう動作になるか説明していないんだから、
一定の動作を期待できないコードに何を期待しているのか分かるはずがない。
# もちろん、推測はできるけどね。推測で議論したくないだろ!
それに対して、説明を求めただけ。
「仕様外のコードでうまく動くかどうか分からん」なんてのは
最初から分かっているから。
Re:素朴な疑問 (スコア:0)
>テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
と書いているからには、
動作確認するコードが言語仕様にマッチしない必要性を説明しなければなりません。
しかし、例示されたコードは、単に言語仕様に外れた例を示したに過ぎません。
ここは単に「言語仕様にマッチしたコードを書けよ。」で終了するところでしょう。
> まあ、まずはこんなところに背伸びしてコメントせずにしっかり勉強しましょう。
相手を見下したつもりにならないとコメントが書けないのなら、
こんなところに書込みをしない方が世の為になりますよ。
Re:素朴な疑問 (スコア:3, 参考になる)
strict-aliasing の問題なら、 ってコードでも示して、「このコードの実行結果が10になるのか20になるのか?」と言えば十分です。
これは「新しいgccでは結果が変わる」ことの例で「動作確認するコードが、完全には言語仕様に準拠していない」ことの説明になっていませんが、
このコードと比べても、元の(intのポインタにfloatを代入する)コードは「動作確認するコードが言語仕様にマッチしない」例になっていないと。
Re:素朴な疑問 (スコア:2, 興味深い)
この例で新しいコンパイラで本当に10が表示されるんですか?
私は4.2をチェックしてませんので、4.2で変わったというのであればそのように教えてほしいのですけど。
gcc4.1のstrict-aliasingのオプション説明を見る限り
`-fstrict-aliasing'
Allows the compiler to assume the strictest aliasing rules
applicable to the language being compiled. For C (and C++), this
activates optimizations based on the type of expressions. In
particular, an object of one type is assumed never to reside at
the same address as an object of a different type, unless the
types are almost the same. For example, an `unsigned int' can
alias an `int', but not a `void*' or a `double'. A character type
may alias any other type.
中略
Enabled at levels `-O2', `-O3', `-Os'
と書かれてます。
主要な部分だけ意訳すると、
異なった型のポインタを経由して同じオブジェクトにアクセスする事はないという前提で
最適化を行う。(ただし、似たようなポインタ、int *に対してunsigned int *のような場合、は除く)
この最適化オプションは-O2, -O3 -Osで使われる。
しかし、ここで新たに示されたサンプルコードは、同じ型のポインタを使ってアクセスするため、
上に書いた条件を満たしません。
したがって、このコードで、20が表示されるというのは、少なくともgcc-4.1においては
strict-aliasingが適用されたとしても、ないと思うのです。
# このような異なった型の間の変換を合法的に行うにはunionを使えと書いてあるけど
# 実際に存在するコードで守られているとは言い切れないし、unionも使い方で問題が出る
# と<中略>したところに書いてあります。一読をお勧めします。
# フレームの最中にIDってのは、いやなんだけど、放置もできないからID
Re:素朴な疑問 (スコア:1, 興味深い)
フレーマ相手にご苦労様です。
つまり、
×> テストで難しいのは、動作確認するコードが、完全には言語仕様に準拠していない事があるという事です。
○> テストで難しいのは、動作確認するコードが、コンパイラに依存している場合があるという事です。
もしくは、
○> テストで難しいのは、動作確認するコードもコンパイラに依存している場合です。
でFAですか?
この主張なら誰もケンカしてないと思うよ。