アカウント名:
パスワード:
その結果定数メモリへの書き込みが発生するのがバグ
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
すくなくともC++では未定義ではないな。それ経由で書き込むと未定義。読むのはOK。
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
本当だ、C言語ではconst外しキャストそれ自体が未定義動作なのか。じゃあ今回のLLVMの変更はまだ穏当な方だな
本当だ、C言語ではconst外しキャストそれ自体が未定義動作なのか。
https://kikakurui.com/x3/X3010-2003-01.html [kikakurui.com] に
const修飾型で定義されたオブジェクトを,非 const 修飾型の左辺値を使って変更しようとした場合,その動作は未定義とする。
とはあるけど「本当だ」って何が?
とりあえず、型変換の話なんだから型変換の節を読みなよ。型修飾子の節に型変換の話が載ってるわけないでしょ。
横レスだけど特に言及されてないよね。アクセス時に本体がconstだった場合だとか、暗黙で変換できるできないみたいな話はあるけど。指摘する側に提示を行ってほしいところ。
指摘する側ってどっちのことかわからないけど「規格が何の要求も課していないもの」が未定義動作なんだからconst外しキャストは未定義動作ではないって人たちに規格の課している要求を示してほしいな。修飾を付与した場合はキャスト前後で同値になると書いてあるけど、外した場合も同値になるとか書いてあるのだろうか。
#3692905 だけでは「constオブジェクトの変更について記載があるんだから、キャストで外せるはずだ!」っていう妄想でしかない。
「規格が何の要求も課していないもの」が未定義動作なんだから
「未定義の動作」も「未規定の動作」も「規格が何の要求も課していないもの」だけども、const外しキャストが前者であるという根拠は何?
妄想の類?
未規定の定義も知らんのか。「この規格が,二つ以上の可能性を提供し,個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。」「規格の提供した可能性から何を選択するか要求を課さない」のが未規定であって、何の可能性も示さないものは未規定ではない。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
キャストでconstを外すのがバグではなく (スコア:1)
その結果定数メモリへの書き込みが発生するのがバグ
Re: (スコア:0)
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
Re: (スコア:1)
すくなくともC++では未定義ではないな。
それ経由で書き込むと未定義。読むのはOK。
Re: (スコア:1)
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。
strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
Re: (スコア:0)
本当だ、C言語ではconst外しキャストそれ自体が未定義動作なのか。じゃあ今回のLLVMの変更はまだ穏当な方だな
Re: (スコア:0)
本当だ、C言語ではconst外しキャストそれ自体が未定義動作なのか。
https://kikakurui.com/x3/X3010-2003-01.html [kikakurui.com] に
const修飾型で定義されたオブジェクトを,非 const 修飾型の左辺値を使って変更しようとした場合,その動作は未定義とする。
とはあるけど「本当だ」って何が?
Re: (スコア:0)
とりあえず、型変換の話なんだから型変換の節を読みなよ。
型修飾子の節に型変換の話が載ってるわけないでしょ。
Re: (スコア:0)
横レスだけど特に言及されてないよね。
アクセス時に本体がconstだった場合だとか、
暗黙で変換できるできないみたいな話はあるけど。
指摘する側に提示を行ってほしいところ。
Re:キャストでconstを外すのがバグではなく (スコア:0)
指摘する側ってどっちのことかわからないけど「規格が何の要求も課していないもの」が未定義動作なんだから
const外しキャストは未定義動作ではないって人たちに規格の課している要求を示してほしいな。
修飾を付与した場合はキャスト前後で同値になると書いてあるけど、外した場合も同値になるとか書いてあるのだろうか。
#3692905 だけでは「constオブジェクトの変更について記載があるんだから、キャストで外せるはずだ!」っていう妄想でしかない。
Re: (スコア:0)
「規格が何の要求も課していないもの」が未定義動作なんだから
「未定義の動作」も「未規定の動作」も「規格が何の要求も課していないもの」だけども、const外しキャストが前者であるという根拠は何?
妄想の類?
Re: (スコア:0)
未規定の定義も知らんのか。
「この規格が,二つ以上の可能性を提供し,個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。」
「規格の提供した可能性から何を選択するか要求を課さない」のが未規定であって、何の可能性も示さないものは未規定ではない。