EN JA
STRLCPY(3)
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() については、 srcdst の両方がヌル文字で終了しなければならないことを意味します。

サイズまでの strlcpy() 関数は、ヌル文字で終了した文字列 src から結果がヌル文字で終了する dstsize - 1 文字コピーします。

strlcat() 関数は、ヌル文字で終了した文字列 srcdst の終りに追加します。それは、多くても 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