2018/12/30

[c/c++][CERT]opaqueな型

C言語実装のセキュリティを高めるために(自分が)!の学習中。



DCL12-C. 抽象データ型は opaque な型を使って実装する
https://www.jpcert.or.jp/sc-rules/c-dcl12-c.html

なんでopaqueだけ英語なんだよ、というのが第一印象だ。
opaqueって、透過とかそういう意味だったよなー、と思ったのだが、逆で「不透明」とかそんな意味だった。
反対語はtransparentらしい。
つまり、中身を見せたくないようなデータ型を指している。


自分がこれをやるときはvoid*を引数にさせていたのだが、型がないとコンパイラでチェックできないのだ。
そう考えると、このやり方の方が賢いな。


これを使うと中身は隠蔽できるのだが、隠蔽するだけに呼び出し元で変数を作ることができない。
ポインタ型なら作ることができるので、呼び出した先で作ってもらうようなしくみがいるだろう。


01: struct xxx;
02: typedef struct xxx xxx_t;
03: 
04: void func(...)
05: {
06:    xxx_t *p_x = CreateXxx();


ちょっと嫌なのは、一時的に使いたいだけでもスタック変数として作ることができないという点だ。
何かしらのヒープ領域がいるし、それがグローバル変数でないのなら解放する処理もいる。

C++だとコンストラクタ/デストラクタで処理できて楽なのだけど、C言語だと、ねぇ。。。
それに、ヒープ領域を操作できるようにしてない環境だと、グローバル変数で予め確保しておくしかなかろう。


とはいっても、こういうことをしたいのは、OSとかライブラリのように、内部の動きを知られたくなかったり、内部の値を想定して実装されてもろくなことがないとか、だろう。


だから、これは使いたいときに使えばよい技だと判断した。
ポインタを渡している以上、それを破壊するのは相手の自由だし。

0 件のコメント:

コメントを投稿

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