str{,l,n}cpy()
新城@筑波大学情報です。こんにちは。
In article <m31xq69bk5.fsf@kzin.dip.jp>
Mito <co_mon@ybb.ne.jp> writes:
> 新城さんがおっしゃる「誤用」というのをはっきり知りたいと思っ
> ていますので教えてください。しつこくてすみません。
誤用というのは、strncpy() で、n があるからバッファオーバーラ
ンしないだろうということで、strlcpy() の代りに使うというもの
です。n があると 0 で埋めるという動作を知らないで。
あと、strlen() してバイト数を数えてから strncpy() したり。
strncpy(dst,src,strlen(src));
> 一概にどの方法がいいということは言えないと思うんです。
> strlcpy を使ったほうがいい場合もありますし、strcpy で十分な
> 場合もあると思うのですが、その判断を行うには、それらの関数の
> 仕様の理解と、想定される危険性についての知識が必要だと思うの
> です。
「場合による」というと、まあ、小泉首相みたいで、それはそうな
んだけど。
> というのを踏まえて、たとえばですが、こんなのでも多くのケース
> では十分安全だと思います。
>
> void copy(char *dst, char *src, size_t n)
> {
> char *b;
> size_t l = strlen(src);
> if (!(b = (char*)malloc(l + 1)))
> abort();
> strcpy(b, src);
> if (l > n)
> b[n] = '\0';
> strcpy(dst, b);
> free(b);
> }
たしかに、malloc() した直後で大きさが分かっていれば strcpy()
でもOKというのはわかります。でも、大きさわかつているなら、
memcpy() したい。
void copy(char *dst, char *src, size_t n)
{
size_t l = strlen(src);
if( l > n-1 )
l = n-1 ;
memcpy(dst,src,l);
dst[l] = 0;
}
とまあ、strcpy() が必要になる例は、消えました。
In article <btvfe0$9r$1@caraway.media.kyoto-u.ac.jp>
<kounoike@mbh.nifty.com> writes:
> 本筋からは離れますが,上とほぼ同じことでよいなら,strcpyにこだわらなくとも
> char * copyn(char *dst, char *src, size_t n) {
> int i;
> char *s;
> s = dst;
> for(i = 0; !(*dst++ = *src++) || i < n - 1; i++);
> *dst = '\0';
> return s;
> }
バイト単位でコピーするのと memcpy() とどうなんでしょうね。
memcpy() は、大きいとバイト単位ではなくて、ワード単位でコピー
したりするんじゃないかなあ。CPU にもよるかもしれないけれど。
Pentium って、バイト単位の演算が妙に速いんですよね。
> くらいでもよいような。また,仕様は若干違ってきますが,
> strncpy(dst, src, n);
> dst[n] = '\0';
> でも十分な気がします。
src が短い時、これは重いんです。strlcpy() ならいいんだけど。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735