C,C++において、ポインタを確保しただけで、データ領域を確保せずにデータを書き込んでしまうと、バッファーオーバーフローなどを起こして、メモリーが破壊されてしまいます。


ポインタ不定の例

例えば、次の場合は一見いいように見えますが、ポインタのa不定のままなので、どこに文字列が格納されてしまうかわかりません。

char *a;
strcpy( a, "abcdefg" )


ポインタと領域の結び付け

ポインタとは、その名の通り、ある領域の場所を指すものです。したがって、正しくは以下のように、配列などの領域の宣言とポインタの結び付けが必要です。

char buf[10];
char *a;

a = buf;
strcpy( a, "abcdefg" )

しかし、これだけでは、まだ脆弱性は残っています。コピーする文字列が、bufのサイズより小さいことが保障されていないと、やはり、バッファーオーバーフローを起こしてしまいます。

コピーする数を引数に持つ関数strncpyを活用するとよいです。


直接代入の意味

コンパイラの力を借りて、下記のようにしてもいいですが、意味が変わってくることに注意してください。

char *a;
a = "abcdefg";

strcpyの場合は、ポインタaが指し示す場所に文字列を格納しますが、上記の場合は、文字列がある場所のアドレスをaに格納するという意味になります。

2021/07/19