strlcpy |
辞書:電算用語の基礎知識 プログラミング仕様編 (PTPROGS) |
読み:ストリ-エル-コピー |
外語:strlcpy |
品詞:名詞 |
Cで、安全に文字列をコピーするための関数。OpenBSDで最初に実装され、各種BSDで使用されている。
|
書式 |
#include <string.h>
概要 |
標準Cライブラリに含まれるstrcpyやstrncpyの代替として、OpenBSDの開発者であるTodd C. Millerらにより実装された。
strcpyは頻繁にバッファーオーバーフローを発生させる代表的な関数であるが、strncpyには仕様上の欠陥がありstrcpyの代替としては使いにくい。そこで、strlcpyが作られた。
戻り値 |
複写元の文字列*srcの長さ(バイト数)がsize_t型で返る。この長さには、NUL末端'\0'は含まない。
戻り値はstrlen(src)と同じものである。戻り値>=nの時、切り捨てが発生したことを意味する。
仕様 |
挙動 |
strncpy等との違い |
定義 |
/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はよく適合する。
関連関数 |
リンク |
通信用語の基礎知識検索システム WDIC Explorer Ver 7.04a (27-May-2022) Search System : Copyright © Mirai corporation Dictionary : Copyright © WDIC Creators club |