アカウント名:
パスワード:
その結果定数メモリへの書き込みが発生するのがバグ
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
すくなくともC++では未定義ではないな。それ経由で書き込むと未定義。読むのはOK。
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
これはconstやキャストの問題ではなくstrchrの戻り値をconst char*にすべきだったという問題だと思いますね
strchr自体は、strを書き換えないので、引数はconstでいい。戻りは、呼び出し元が書き換えたいニーズもあるので、裸でいい。でないとキャストがいる。書き換えないなら、const char*な変数にでもうければいい。こっちはキャストいらない。
strchrの戻り値がchar *の場合、strchrの内部でconst外しキャストが必要strchrの戻り値がconst char*の場合、呼び出し元で(書き換えたいときは)const外しキャストが必要
どちらにしろ、const外しキャストが必要になり好ましくないね
私のない頭では「発見したオフセットを戻り値として、str + 戻り値を呼び出し元で作ってね」というCっぽくない(ポインタのない言語では普通の)方法しか思いつかない
castがお嫌いなら、Cには、unionってやつもあるけどねー。だいたいconst剥がしキャストがC99で未定義とか誤解じゃろ。n1124読んだけど、書いてないだけで、undefinedと書いてあるわけじゃないし。6.7.3.5には、const修飾されて定義されたobjectをnon-constなlvalue経由で書き換える行為はundefinedって書いてあるんだが。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー
キャストでconstを外すのがバグではなく (スコア:1)
その結果定数メモリへの書き込みが発生するのがバグ
Re: (スコア:0)
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
Re: (スコア:1)
すくなくともC++では未定義ではないな。
それ経由で書き込むと未定義。読むのはOK。
Re: (スコア:1)
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。
strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
Re: (スコア:0)
これはconstやキャストの問題ではなくstrchrの戻り値をconst char*にすべきだったという問題だと思いますね
Re: (スコア:1)
strchr自体は、strを書き換えないので、引数はconstでいい。
戻りは、呼び出し元が書き換えたいニーズもあるので、裸でいい。でないとキャストがいる。
書き換えないなら、const char*な変数にでもうければいい。こっちはキャストいらない。
Re: (スコア:0)
strchrの戻り値がchar *の場合、strchrの内部でconst外しキャストが必要
strchrの戻り値がconst char*の場合、呼び出し元で(書き換えたいときは)const外しキャストが必要
どちらにしろ、const外しキャストが必要になり好ましくないね
私のない頭では「発見したオフセットを戻り値として、str + 戻り値を呼び出し元で作ってね」という
Cっぽくない(ポインタのない言語では普通の)方法しか思いつかない
Re:キャストでconstを外すのがバグではなく (スコア:1)
castがお嫌いなら、Cには、unionってやつもあるけどねー。
だいたいconst剥がしキャストがC99で未定義とか誤解じゃろ。n1124読んだけど、書いてないだけで、undefinedと書いてあるわけじゃないし。
6.7.3.5には、const修飾されて定義されたobjectをnon-constなlvalue経由で書き換える行為はundefinedって書いてあるんだが。