OSDN Git Service

Update README
[linuxjm/LDP_man-pages.git] / release / man3 / strcpy.3
index dddb940..7481acc 100644 (file)
@@ -1,5 +1,6 @@
 .\" Copyright (C) 1993 David Metcalfe (david@prism.demon.co.uk)
 .\"
+.\" %%%LICENSE_START(VERBATIM)
 .\" Permission is granted to make and distribute verbatim copies of this
 .\" manual provided the copyright notice and this permission notice are
 .\" preserved on all copies.
@@ -19,6 +20,7 @@
 .\"
 .\" Formatted or processed versions of this manual, if unaccompanied by
 .\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
 .\"
 .\" References consulted:
 .\"     Linux libc source code
 .\" This file was generated with po4a. Translate the source file.
 .\"
 .\"*******************************************************************
-.TH STRCPY 3 2010\-09\-20 GNU "Linux Programmer's Manual"
+.\"
+.\" Japanese Version Copyright (c) 1997 YOSHINO Takashi
+.\"       all rights reserved.
+.\" Translated Mon Jan 20 22:35:40 JST 1997
+.\"       by YOSHINO Takashi <yoshino@civil.jcn.nihon-u.ac.jp>
+.\" Updated 2012-05-29, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
+.\"
+.TH STRCPY 3 2014\-05\-21 GNU "Linux Programmer's Manual"
 .SH 名前
 strcpy, strncpy \- 文字列をコピーする
 .SH 書式
@@ -48,12 +58,14 @@ strcpy, strncpy \- 文字列をコピーする
 .fi
 .SH 説明
 \fBstrcpy\fP()  関数は \fIsrc\fP が指す文字列を末尾のヌルバイト (\(aq\e0\(aq) も含めて \fIdest\fP
-が指すバッファにコピーする。 二つの文字列は重なってはならない。受け側の文字列 \fIdest\fP は コピーを受け取るのに十分な大きさでなければならない。
+が指すバッファーにコピーする。 二つの文字列は重なってはならない。受け側の文字列 \fIdest\fP は
+コピーを受け取るのに十分な大きさでなければならない。 \fIバッファーオーバーランに気を付けること!\fP (「バグ」の節を参照)
 .PP
 \fBstrncpy\fP()  関数も同様だが、 \fIsrc\fP のうち最大でも \fIn\fP バイトしかコピーされない点が異なる。 \fB警告\fP: \fIsrc\fP
 の最初の \fIn\fP バイトの中にヌルバイトがない場合、 \fIdest\fP に格納される文字列はヌルで終端されないことになる。
 .PP
-\fIsrc\fP の長さが \fIn\fP よりも短い場合、 \fBstrncpy\fP()  は \fIdest\fP の残りをヌルバイトで埋める。
+\fIsrc\fP の長さが \fIn\fP よりも短い場合、 \fBstrncpy\fP() は \fIdest\fP に追加のヌルバイトを書き込み、全部で \fIn\fP
+バイトが書き込まれるようにする。
 .PP
 \fBstrncpy\fP()  の簡単な実装は以下のような感じであろう:
 .in +4n
@@ -74,33 +86,61 @@ strncpy(char *dest, const char *src, size_t n)
 .fi
 .in
 .SH 返り値
-\fBstrcpy\fP()  関数と \fBstrncpy\fP()  関数は 受け側の文字列\fIdest\fPへのポインタを返す。
+\fBstrcpy\fP()  関数と \fBstrncpy\fP()  関数は 受け側の文字列\fIdest\fPへのポインターを返す。
+.SH 属性
+.SS "マルチスレッディング (pthreads(7) 参照)"
+関数 \fBstrcpy\fP() と \fBstrncpy\fP() はスレッドセーフである。
 .SH 準拠
 SVr4, 4.3BSD, C89, C99.
 .SH 注意
 \fBstrncpy\fP()  は効率的でなく間違いを起こしやすいと考えるプログラマもいるだろう。 プログラマが \fIdest\fP の大きさが \fIsrc\fP
 の長さよりも 大きいことを知っている (つまり、そのことをチェックするコードを 書いている) 場合は、 \fBstrcpy()\fP を使うことができる。
 
-\fIsrc\fP の最初の \fIn\fP 文字に終端のヌルバイトがない場合、 \fBstrncpy\fP()  は \fIdest\fP
-に終端されていない文字列を生成する。 プログラマは間違いを防止するために、 以下のように強制的に終端を行うことがよくある。
+\fBstrncpy\fP() の正しい (かつ意図された) 用途は、 C 文字列の固定長バッファーへのコピーを、 バッファーがオーバーフローしないことと、
+宛先バッファーの未使用バイトが 0 で埋められることの両方を保証しつつ行うことである。 (宛先バッファーを 0 で埋めるのは、 たいていの場合、
+バッファーを媒体に書き込んだり、別のプロセスにプロセス間通信を用いて送信したりした場合に情報洩れを防ぐためである)。
+
+\fIsrc\fP の最初の \fIn\fP バイトに終端のヌルバイトがない場合、 \fBstrncpy\fP() は \fIdest\fP
+に終端されていない文字列を生成する。 \fIbuf\fP の長さが \fIbuflen\fP の場合、以下のようにして強制的に終端することができる。
 .in +4n
 .nf
 
-strncpy(buf, str, n);
-if (n > 0)
-    buf[n \- 1]= \(aq\e0\(aq;
+strncpy(buf, str, buflen \- 1);
+if (buflen > 0)
+    buf[buflen \- 1]= \(aq\e0\(aq;
 .fi
 .in
+.PP
+.\"
+(もちろん、上記の方法では、 \fIsrc\fP に入っている情報が \fIbuflen\ \-\ 1\fP バイトよりも多い場合には、 \fIdest\fP
+へのコピー時に情報が失われるという事実は無視している。)
+.SS strlcpy()
+いくつかのシステム (BSD、Solaris など) では以下の関数が提供されている。
+
+    size_t strlcpy(char *dest, const char *src, size_t size);
+
+.\" http://static.usenix.org/event/usenix99/full_papers/millert/millert_html/index.html
+.\"     "strlcpy and strlcat - consistent, safe, string copy and concatenation"
+.\"     1999 USENIX Annual Technical Conference
+.\" https://lwn.net/Articles/506530/
+この関数は \fBstrncpy\fP() と同様だが、 最大でも \fIsize\-1\fP バイトしか \fIdest\fP にコピーをせず、
+末尾への終端のヌルバイトの追加が必ず行われ、 宛先バッファー (の未使用部分) へのヌルバイトの書き込みが行われない。 この関数では
+\fBstrcpy\fP() や \fBstrncpy\fP() の持つ問題のいくつかが修正されているが、 \fIsize\fP
+が小さすぎた場合にはデータが失われる問題には、 依然として呼び出し側で対処する必要がある。 この関数の返り値は \fIsrc\fP の長さである。
+これにより、 末尾の切り詰めが行われたかを簡単に検出することができる。 返り値が \fIsize\fP 以上の場合には、 末尾の切り詰めが発生している。
+データロスが問題となる場合は、 呼び出し側で、 呼び出し前に引き数をチェックするか、 この関数の返り値を検査するかのいずれかをしなければならない。
+\fBstrlcpy\fP() は glibc  には存在せず、 POSIX による標準化もされていないが、 Linux では \fIlibbsd\fP
+ライブラリ経由で利用できる。
 .SH バグ
 \fBstrcpy\fP()  の受け側の文字列が十分な大きさでない場合、何が起こるかわからない。
 固定長文字列を溢れさせるのは、マシンの制御を掌中に収めるために クラッカーが好んで使うテクニックである。
-プログラムでデータをバッファに読み込んだりコピーしたりする場合には、 必ずまず最初に十分な大きさがあるかどうかをチェックする必要がある。
\83\97ã\83­ã\82°ã\83©ã\83 ã\81§ã\83\87ã\83¼ã\82¿ã\82\92ã\83\90ã\83\83ã\83\95ã\82¡ã\83¼ã\81«èª­ã\81¿è¾¼ã\82\93ã\81 ã\82\8aã\82³ã\83\94ã\83¼ã\81\97ã\81\9fã\82\8aã\81\99ã\82\8bå ´å\90\88ã\81«ã\81¯ã\80\81 å¿\85ã\81\9aã\81¾ã\81\9aæ\9c\80å\88\9dã\81«å\8d\81å\88\86ã\81ªå¤§ã\81\8dã\81\95ã\81\8cã\81\82ã\82\8bã\81\8bã\81©ã\81\86ã\81\8bã\82\92ã\83\81ã\82§ã\83\83ã\82¯ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bã\80\82
 プログラマがオーバーフローが不可能だと示せる場合には このチェックは不要かもしれないが、十分注意すること。
 長い間には、不可能だったことが可能になるような方法でプログラムが 変更されることもあるからだ。
 .SH 関連項目
 \fBbcopy\fP(3), \fBmemccpy\fP(3), \fBmemcpy\fP(3), \fBmemmove\fP(3), \fBstpcpy\fP(3),
 \fBstpncpy\fP(3), \fBstrdup\fP(3), \fBstring\fP(3), \fBwcscpy\fP(3), \fBwcsncpy\fP(3)
 .SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.40 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
 である。プロジェクトの説明とバグ報告に関する情報は
 http://www.kernel.org/doc/man\-pages/ に書かれている。