アカウント名:
パスワード:
その結果定数メモリへの書き込みが発生するのがバグ
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
すくなくともC++では未定義ではないな。それ経由で書き込むと未定義。読むのはOK。
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
> strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
それはアタナの勘違い
const char * strchr ( const char * str, int character ); char * strchr ( char * str, int character );
プロトタイプ宣言が2つあります
const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
Cでそんなことできたっけかな?
int main(void){}
https://wandbox.org/permlink/k4ROmZcUnxTwh7Ab [wandbox.org]
prog.c:2:20: error: conflicting types for 'strchr' 2 | char * strchr ( char * str, int character ); | ^~~~~~
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie
キャストでconstを外すのがバグではなく (スコア:1)
その結果定数メモリへの書き込みが発生するのがバグ
Re: (スコア:0)
非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ
Re: (スコア:1)
すくなくともC++では未定義ではないな。
それ経由で書き込むと未定義。読むのはOK。
Re: (スコア:1)
C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。
strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
Re: (スコア:0)
> strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。
それはアタナの勘違い
const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
プロトタイプ宣言が2つあります
Re:キャストでconstを外すのがバグではなく (スコア:0)
それはアタナの勘違い
const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
プロトタイプ宣言が2つあります
Cでそんなことできたっけかな?
const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
int main(void)
{
}
https://wandbox.org/permlink/k4ROmZcUnxTwh7Ab [wandbox.org]
prog.c:2:20: error: conflicting types for 'strchr'
2 | char * strchr ( char * str, int character );
| ^~~~~~