strcpy

読み:ストリ・コピー
外語:strcpy 英語
品詞:名詞

標準Cライブラリに含まれる、文字列をコピーするための関数。頻繁にバッファーオーバーフローを発生させる、セキュリティホールを産む代表的な関数である。

目次

#include <string.h>

char *strcpy(char *dest, const char *src);

複写先destへのポインターが返る。

strcpyの第一引数がそのまま返るだけなので、この戻り値は無意味であり、用いることはない。

Cにおける、文字列の複写関数の代表である。

このstrcpyは危険な関数だが、strcpyが常に危険かと言えば、当然だが、そのようなことはない。ただ、安全に使うことが非常に難しいのである。

挙動

  • srcからdestに複写する。
  • destに複写された文字列の最後は、必ずNUL文字で終わる。
  • srcとdestが重なっていた場合の挙動は未定義である。
  • destで確保されるバッファーサイズは、常にsrc以上(最後のNUL文字の分も含む)でなければならない。

定義

/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を使うべきである。

  • bcopy
  • memccpy
  • memcpy
  • memmove
  • stpcpy
  • strcpy_s
  • strdup
  • strlcpy
  • wcscpy
  • wcsncpy
用語の所属
C
関連する用語
strlcpy
バッファーオーバーフロー攻撃

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club