新城@筑波大学情報です。こんにちは。

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() ならいいんだけど。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\