STRLCPY(3) | FreeBSD Library Functions Manual | STRLCPY(3) |
名称
strlcpy, strlcat — サイズ限界のある文字列複写および連結ライブラリ
Standard C Library (libc, -lc)書式
#include < string.h> size_t
strlcpy( char * restrict dst, const char * restrict src, size_t size);
size_t
strlcat( char * restrict dst, const char * restrict src, size_t size);
解説
strlcpy() と strlcat() 関数は、文字列をそれぞれコピーして連結します。それらは、安全で、より堅実に設計されています。そして strncpy(3) と strncat(3) のためのよりエラーの少ない置換です。それらの関数と違って、 strlcpy() と strlcat() は、結果 ( size が 0 より大きい限り、あるいは、 strlcat() の場合には、 dst において少なくとも 1 バイトの自由がある限り) がヌル文字で終了することを保証するために (単なる長さではない) バッファの全部のサイズをとります。ヌル文字のための 1 バイトが size に含まれるべきであることに注意してください。さらに strlcpy() と strlcat() が本当の“C”文字列でのみ動作することに注意してください。これは、 strlcpy() については、 src は、ヌル文字で終了しなければならない、そして strlcat() については、 src と dst の両方がヌル文字で終了しなければならないことを意味します。サイズまでの strlcpy() 関数は、ヌル文字で終了した文字列 src から結果がヌル文字で終了する dst へ size - 1 文字コピーします。
strlcat() 関数は、ヌル文字で終了した文字列 src を dst の終りに追加します。それは、多くても size - strlen(dst) - 1 バイトを追加するでしょう、結果は、ヌル文字で終了します。
戻り値
strlcpy() と strlcat() 関数は、それらが作成しようとした文字列の合計の長さを返します。 strlcpy() では、 src の長さを意味します。 strlcat() では、初期の dst の長さプラス src の長さを意味します。これが多少混乱させるように思われますが、それは、切捨て検知を単純にするために行なわれます。しかしながら、 strlcat() は、ヌル文字を見つけずに、 size 文字を横断する場合、文字列の長さは、 size であると考えられます。そして、送り先文字列は、 (ヌル文字のためのスペースがなかったので) ヌル文字で終了しないことに注意してください。 strlcat() は、文字列の終りからはみ出したままにします。実際には、 ( size が正しくないか、 dst が適切な“C”文字列ではないことのいずれかを意味するので) これは、起こってはなりません。チェックは、正しくないコード中の潜在的なセキュリティ問題を防ぐために存在します。
使用例
次のコードの破片は、単純な場合を説明しています。
char *s, *p, buf[BUFSIZ]; ... (void)strlcpy(buf, s, sizeof(buf)); (void)strlcat(buf, p, sizeof(buf));
できれば、パスネームを構築する間に切捨てを検出するためには、次のように使われなければならないでしょう。
char *dir, *file, pname[MAXPATHLEN]; ... if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname)) goto toolong; if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname)) goto toolong;
最初どのくらい文字をコピーしたか知っているので、追加の代わりにコピーを使用することによって少しスピードアップすることができます。
char *dir, *file, pname[MAXPATHLEN]; size_t n; ... n = strlcpy(pname, dir, sizeof(pname)); if (n >= sizeof(pname)) goto toolong; if (strlcpy(pname + n, file, sizeof(pname) - n) >= sizeof(pname) - n) goto toolong;
しかしながら、それらは、 strlcpy() と strlcat() の全体の目的を駄目にするので、そのような最適化の有効性を疑問に思うかもしれません。実は、このマニュアルページの最初のバージョンは、それを誤解しました。
歴史
strlcpy() と strlcat() 関数は、 OpenBSD 2.4 ではじめて登場し、 FreeBSD 3.3 でそれらは、登場しました。June 22, 1998 | FreeBSD |