アカウント名:
パスワード:
GCCのマニュアルに、charはバイトアクセスしますと書いてない限り、バグとは言い難い気がするけど。
Because this is not aquestion of "the standard is ambiguous", this is a question of "thecompiler turned good code into code that could SIGSEGV in user space too,if 'malloc()' happened to return a pointer at the end of an allocation".
「legal optimization」って言いたくなるのも
'a'を'A'に書き換えたくて
*p = 'A';
そういう時に「コンパイラがバイトアクセスに展開するのを当てにせずに、そこだけアセンブラに」とかやっていたらきりがありませんよ。
# ちょっと手元に標準仕様がないんで戯言扱いで
1バイトだけの書き換えでも、4バイト読み→1バイト変更→4バイト書き (Read-Modify-Write) で実装する可能性もあるからでは。
読み書き先が volatile だと上記の方法を使うのは NG だと思われます。
ポインタなんだから1byteアクセスが正しいはずで
ここは、「charへのポインタなんだから」と勝手に推測します。
なんで4byteもアクセスされるのかがわかんないです。
コンパイラがバグっているからです。
元の話の例では2バイトアクセスになっています。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア
「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:5, 参考になる)
i386系はアライメントにあまりうるさくないからページ境界をまたがない限りは表面化しないけど
> char c = *p++;
このコードをワードアクセスなんかにされたら、ARM/MIPS/SHなどのアライメントに厳しいCPUじゃ、一発アウトですよね。
この調子だと文字列操作なんかで良く使う
> while ((c = *str++) != '\0')
見たいなコードも怪しくなってくるんで、「legal optimization」って言いたくなるのも良くわかるなぁ。
# gccの最適化に伴う弊害ではstrict aliasing関連もちょっとやりすぎな気がする
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:1, おもしろおかしい)
GCCのマニュアルに、charはバイトアクセスしますと書いてない限り、バグとは言い難い気がするけど。
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:1, すばらしい洞察)
C言語なんだから(w
言ってること分かるか?
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
言えないわけで、「壊れるところに変数が割り当たってない」前提のもとでは
「バグ(C言語の仕様違反)とは言えない」という元コメントの指摘は正当なものだと思います。
もちろん、Linusはバグだと主張するために、malloc() の実装によっては、
この前提条件が成り立たない場合がありうることを指摘しています。
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
必死だな(w
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
それだけでCの仕様に違反していると言えないのは事実。
元コメントはそこまで考えてないようにも読めるけど。
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:1)
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
確かに言ってるのは「legal optimization」だし。
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:2, 参考になる)
'a'を'A'に書き換えたくて
としたときに4バイトアクセスされて後ろの3バイトを壊されるかもしれません。そういう時に「コンパイラがバイトアクセスに展開するのを当てにせずに、そこだけアセンブラに」とかやっていたらきりがありませんよ。
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:0)
・・・すみません。
本気で何が悪いのか分からないんで解説してもらえませんか?
ポインタなんだから1byteアクセスが正しいはずで
なんで4byteもアクセスされるのかがわかんないです。
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:1)
# ちょっと手元に標準仕様がないんで戯言扱いで
1バイトだけの書き換えでも、4バイト読み→1バイト変更→4バイト書き (Read-Modify-Write) で実装する可能性もあるからでは。
読み書き先が volatile だと上記の方法を使うのは NG だと思われます。
Re:「本物の」バイト単位でのメモリアクセスが必要だって事? (スコア:1)
ここは、「charへのポインタなんだから」と勝手に推測します。
コンパイラがバグっているからです。
元の話の例では2バイトアクセスになっています。
そういう場合は (スコア:0)