Re: [Q] see return value (strncpy)
yas@is.tsukuba.ac.jp (Yasushi Shinjo) writes:
> バッファ・オーバーフローを防ぐには、strncpy() は実は今一つで
> す。n を取りますが、最後に埋めるだけなので。結構、誤用される
> 関数だと思います。私もだいぶ長い間誤用していた気がします。
> 本当は、strlcpy() がいいんですよね。
すみません、もう少し詳しく教えてください。
この文は、
strncpy(dest, src, n) は n > strlen(src) の場合に
dest+strlen(src) 以降に nul を埋めるだけで、
strlcpy の場合はこれに加え、n <= strlen(src) の場合も
dest+n に nul を埋めるので、バッファ・オーバーフローを防ぐ
には strlcpy のほうがベターである
ということをおっしゃっているのでしょうか?
# そうじゃないとすると私も長い間誤用しているのに気付かない
# でいたことになりそうなんで。
> ただ、strlcpy() は、Linux に入ってなくて困るんですよね。しょ
> うがないので代りに snprintf() を使うように勧めているんですけ
> ど。いくら snprintf() を使えと言っても、strcpy() とか
> strcat() 使う人が多くて困ります。どうしたらいいでしょうか。
私は strcpy や strcat を好んで使いますし、これからも使ってい
くと思います。strncpy などは n なしに比べてだいぶ遅いんです
もん。
strlcpy/strlcat は今まで知りませんでしたが、FreeBSD や
OpenBSD なんかにしかないならまず使うことはないです。
たぶん strcpy/strcat を使わないように指導するのではなく、そ
れらの関数の危険性と、安全に使うための方法を教えたほうがいい
のではないでしょうか?
そうじゃないと goto 否定論者みたいになっちゃいませんか。
--
01/10 16:03頃
水戸
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