Re: str{,l,n}cpy()
yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
> たしかに、malloc() した直後で大きさが分かっていれば strcpy()
> でもOKというのはわかります。でも、大きさわかつているなら、
> memcpy() したい。
[...]
> とまあ、strcpy() が必要になる例は、消えました。
前の例は strcpy() が必要な例ではなくて、strcpy() を使っても
安全な例だったのですが、どうも私の書きかたがわるいのか誤解を
与えてしまっているようですね。
とにかく、strlcpy() は strncpy() と違い、n 未満の文字列をコ
ピーする場合も、dst[n] まで nul を埋めることはしないというこ
とはわかりましたし、strlcpy() があるなら使うべきで、ない環境
でもある程度以上の規模のソフトを作るなら自前のものを用意して
使うべきだという意見にも同意します。
引用が前後しますが、
> 誤用というのは、strncpy() で、n があるからバッファオーバーラ
> ンしないだろうということで、strlcpy() の代りに使うというもの
> です。n があると 0 で埋めるという動作を知らないで。
> あと、strlen() してバイト数を数えてから strncpy() したり。
>
> strncpy(dst,src,strlen(src));
やっぱりそういう方には「strlcpy使え」じゃなくてちゃんと教え
てあげるのがよさそうな気がしますが、そうもいかないんでしょう
か?
> > 一概にどの方法がいいということは言えないと思うんです。
> > strlcpy を使ったほうがいい場合もありますし、strcpy で十分な
> > 場合もあると思うのですが、その判断を行うには、それらの関数の
> > 仕様の理解と、想定される危険性についての知識が必要だと思うの
> > です。
>
> 「場合による」というと、まあ、小泉首相みたいで、それはそうな
> んだけど。
「...それはそうなんだけど、説明がめんどくさいんだよね」でしょ
うかねぇ?
新城さんの考えは、たとえ strcpy の正しい使いかたを知ったとし
ても使うべきではない、というふうに思われるのですが、もしそう
なら理由を教えてもらえませんか?
私は正しい使いかたを知っていれば別に使ってはいけない関数では
ないと思うのです。
> バイト単位でコピーするのと memcpy() とどうなんでしょうね。
> memcpy() は、大きいとバイト単位ではなくて、ワード単位でコピー
> したりするんじゃないかなあ。CPU にもよるかもしれないけれど。
本題とははずれますが、私は memcpy() ってほとんど使いません。
代わりに memmove() を使います。memcpy() が必要な場面って思い
付きませんが、何かありましたっけ?
--
01/14 22:54頃
水戸
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