ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
標準Cライブラリに含まれる、文字列をコピーするための関数。頻繁にバッファーオーバーフローを発生させる、セキュリティホールを産む代表的な関数である。
複写先destへのポインターが返る。
strcpyの第一引数がそのまま返るだけなので、この戻り値は無意味であり、用いることはない。
Cにおける、文字列の複写関数の代表である。
このstrcpyは危険な関数だが、strcpyが常に危険かと言えば、当然だが、そのようなことはない。ただ、安全に使うことが非常に難しいのである。
/usr/src/lib/libc/string/strcpy.cで、次のように定義されている(FreeBSD 8.0時点)。
char * strcpy(char * __restrict to, const char * __restrict from) { char *save = to; for (; (*to = *from); ++from, ++to); return(save); }
単に複写するだけなので、書き方は様々ありうる。上は、for文の中ですべて済ませる例となっている。
この関数は、複写先のバッファーの長さについては関知しない。十分な大きさがあることを、利用するプログラマーが保証する必要がある。
もし万一、複写元の文字列が複写先のバッファーの長さより長かった場合、複写先のバッファーの外まで不正に書き換えるバッファーオーバーフローを招く。現実には事前のチェックを怠ってstrcpyを使うことが多く、様々なソフトウェアで、頻繁にバッファーオーバーフローの問題を発生させている。
最も簡単で現実的な対策としては、長さが指定できるstrncpyを使うか、strlcpyやstrcpy_sなどの代替となる関数を使うことである。
また、もしC++を使っているなら、このような関数は使わずに素直にstd::stringを使うべきである。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます