yas@is.tsukuba.ac.jp (Yasushi Shinjo) wrote in message news:<YAS.04May3182956@kirk.is.tsukuba.ac.jp>...

> > strcpy → strlcpy の書き替えとは違いますが, やっちゃいそうな間違いと言
> > うと
> > void
> > foo (char *d, const char *s)
> > {
> >   …;
> >   if (strlcpy (d, s, sizeof d) == sizeof d)
> >     むにゃむにゃ; 
> >   …;
> > }
> > なんていうのも思いつきます. 
> 
> これは、strcpy() でも問題があるプログラムですよね。
> 
> foo (char *d, const char *s)
> {
>   …;
>   strcpy(d, s);
>     むにゃむにゃ; 
>   …;
> }
> 
> この strcpy() を strlcpy() に書き換える時に、「あ、d の長さ
> がない」と気が付くはずです。これでバグが1つ減ります。
> 

いや、それで、ヘボいプログラマが、d の長さがないと気付かずに、
strcpy(d, s) => strlcpy(d, s, sizeof d)
ならおっけいね、と目の不自由な的にやってしまうのが
問題なのではないでしょうか。ちょっと極端ですけど...

それよりもっとあり得そうなのは、
> strcpy → strlcpy の書き替えとは違
う例として、

foo(const char s)
{
   static char d[SIZE];
   …;
   if (strlcpy (d, s, sizeof d) == sizeof d)
      むにゃむにゃ; 
   …;
   return d;
}

を、「あ、dを引き数にするよう仕様変更ね、」
といって以下の様にしちゃう場合が考えられます。

> > foo (char *d, const char *s)
> > {
> >   …;
> >   if (strlcpy (d, s, sizeof d) == sizeof d)
> >     むにゃむにゃ; 
> >   …;
> > }