パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

LLVM、定数として宣言されたメモリ領域への代入を削除する最適化を導入」記事へのコメント

  • その結果定数メモリへの書き込みが発生するのがバグ

    • by Anonymous Coward

      非修飾型へのポインタを修飾型へのポインタにキャストするのは許容されているが、逆は未定義動作だろ

      • by Anonymous Coward

        すくなくともC++では未定義ではないな。
        それ経由で書き込むと未定義。読むのはOK。

        • by Anonymous Coward

          C++は知らんが、Cではポインタの型変換について修飾付ける方向のしか規格に記載されていないから、const外しキャストは未定義動作になる。
          strchrとか標準関数ですらreturn値でconst外してくるあたり、規格自体が狂ってる感はあるけども。

          • by Anonymous Coward

            これはconstやキャストの問題ではなくstrchrの戻り値をconst char*にすべきだったという問題だと思いますね

            • strchr自体は、strを書き換えないので、引数はconstでいい。
              戻りは、呼び出し元が書き換えたいニーズもあるので、裸でいい。でないとキャストがいる。
              書き換えないなら、const char*な変数にでもうければいい。こっちはキャストいらない。

              • by Anonymous Coward on 2019年09月29日 10時40分 (#3693137)

                strchrの戻り値がchar *の場合、strchrの内部でconst外しキャストが必要
                strchrの戻り値がconst char*の場合、呼び出し元で(書き換えたいときは)const外しキャストが必要

                どちらにしろ、const外しキャストが必要になり好ましくないね

                私のない頭では「発見したオフセットを戻り値として、str + 戻り値を呼び出し元で作ってね」という
                Cっぽくない(ポインタのない言語では普通の)方法しか思いつかない

                親コメント
              • by Anonymous Coward

                const版と非const版用意するか、インデックスを返すか、
                プログラマの責任でconst付き変数で受ければいいだけ。
                Cは三番目を選択したってだけやな。

              • castがお嫌いなら、Cには、unionってやつもあるけどねー。
                だいたいconst剥がしキャストがC99で未定義とか誤解じゃろ。n1124読んだけど、書いてないだけで、undefinedと書いてあるわけじゃないし。
                6.7.3.5には、const修飾されて定義されたobjectをnon-constなlvalue経由で書き換える行為はundefinedって書いてあるんだが。

                親コメント

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

処理中...