2017/06/01

[c/c++]キャストで逃げる

コーディングするたびに発生して、毎回悩むのに答が出ない問題がいろいろある。

キャストで逃げるというのも、まだ私の中で解決していない。
たとえば、ポインタとサイズをセットにした構造体を作ったとしよう。

struct xxx {
  int len;
  uint8_t *ptr;
};

C言語だと、アドレスは分かってもサイズが分からないからね。


malloc()などでRAMを使う場合はこれでもよいのだが、const値のようにROMで持っているデータを使いたいとなると悩んでしまう。
ptrはconstが付いていないため、書き換え可能なように見えてしまうからだ。
構造体のインスタンスにconstを付けても、lenやptr自体は書き換えできないが、ptrが指す先はconstではないからね。
(最近もこういう話をどこかで書いたな。。。)


今回は、こうやって回避した。

struct const_xxx {
  int len;
  const uint8_t *ptr;
};

constになっている型をもう1つ用意したのだ。
これがあれば、RAMであっても書き換えるつもりがないことを表すこともできるし、大丈夫だ!


と思っていたのだが、また揺らぎだした。

これ、ポインタがプリミティブ型だからよいようなものの、構造体だったらどうだろうか?
その構造体の中にポインタが入っていて、それがconst無しだったら強制力がないだろう。

だったらもう、constにした構造体の中身は下の方に至るまで書き換えるなよ?とした方が潔くないだろうか。
証明するのは大変だが、テストコードで書き換え不可のアドレスを渡して不正メモリアクセスなどの例外が発生しないことを確認するくらいしかないか。

これにconstのアドレスを渡したい場合は、そのまま渡すとwarningが出るので、const外しキャストで逃げることになろう。
格好はよくないのだけど、他に方法が思いつかない。
warningのままにして気付かせるようにしておくのもありだが、warningをerror扱いにしたいこともあるし、何よりうっとうしい。
const_cast<>がないので検索もしづらいのだ。


うーん、いろいろめんどうだ。
何かC言語仕様の見落としがあるかなぁ。。。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。