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頃
水戸