strlcpy

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

Cで、安全に文字列をコピーするための関数。OpenBSDで最初に実装され、各種BSDで使用されている。

目次

#include <string.h>

size_t strlcpy(char *dest, const char *src, size_t n);

標準Cライブラリに含まれるstrcpyやstrncpyの代替として、OpenBSDの開発者であるTodd C. Millerらにより実装された。

strcpyは頻繁にバッファーオーバーフローを発生させる代表的な関数であるが、strncpyには仕様上の欠陥がありstrcpyの代替としては使いにくい。そこで、strlcpyが作られた。

複写元の文字列*srcの長さ(バイト数)がsize_t型で返る。この長さには、NUL末端'\0'は含まない。

戻り値はstrlen(src)と同じものである。戻り値>=nの時、切り捨てが発生したことを意味する。

挙動

  • srcからdestに、最大n-1バイトを複写する。
  • destに複写された文字列の最後は、必ずNUL文字で終わる(サイズnが0で無い場合)。
  • nは、destで確保されたバッファーのサイズのsizeofを格納するのが一般的な用法である。
  • srcとdestが重なっていた場合の挙動は未定義である。

strncpy等との違い

  • strncpyは、srcがnより長い場合、destがNUL文字で終わらないという欠点があるが、strlcpyはこの問題が解決されている。
  • strncpyは、srcがnより短い場合、残りをNUL文字で埋めるが、strlcpyにはそのような機能はない。

定義

/usr/src/lib/libc/string/strncpy.cで、次のように定義されている(FreeBSD 8.0時点)。

size_t
strlcpy(char * __restrict dst, const char * __restrict src, size_t siz)
{
    char *d = dst;
    const char *s = src;
    size_t n = siz;

    /* Copy as many bytes as will fit */
    if (n != 0) {
        while (--n != 0) {
            if ((*d++ = *s++) == '\0')
                break;
        }
    }

    /* Not enough room in dst, add NUL and traverse rest of src */
    if (n == 0) {
        if (siz != 0)
            *d = '\0';      /* NUL-terminate dst */
        while (*s++)
            ;
    }

    return(s - src - 1);    /* count does not include NUL */
}

カーネル用の処理は/usr/src/sys/libkern/strlcpy.cにあり、処理の内容は概ね同じだが、こちらはK&Rスタイルであるなど若干の相違がある。

そもそもstrcpyは、頻繁にバッファーオーバーフローを発生させる、セキュリティホールを産む代表的な関数である。しかし、strcpyが常に危険かと言えば、当然だが、そのようなことはない。ただ、安全に使うことが非常に難しいのである。

事前にsrcの長さを調べ、destより大きい場合の対策などをしてからstrcpyするなら、何の問題もないが、そのような非効率な処理は、現実には書かれない。

一方、代替になりそうなstrncpyは、最大でnバイトのコピーをするが、srcがdestより長い時に末端にNUL文字が入らないため、手作業で末端の処理をせねばならず、これも不便である。

こういった需要に、strlcpyはよく適合する。

  • bcopy
  • memccpy
  • memcpy
  • memmove
  • stpcpy
  • strcpy
  • strcpy_s
  • strdup
  • wcscpy
  • wcsncpy
用語の所属
C
関連する用語
OpenBSD

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


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