
C で、
while (1){
char buf[256];
memset(buf, 0, sizeof(buf));
...
}
などと毎回メモリを 0 で塗りつぶす人がいるが、果たしてこれはよい習慣なのだろうか。
わたしは「適切に文字終端を管理していればこんな初期化は不要」派である。
しかし適切に文字終端を管理できない人はたくさんいる。そういう人にとっては、前回
ループの変数の内容が次ループにも引き継がれてしまう、という最悪の事態を避けるため
のよい方法なのだろう。実際、他人の書いたソースを眺めていて、memset がなかったら
落ちるなぁと思ったことは多々ある。
でもわたしには、ただのバグ隠蔽工作にしか見えない。VC++ でデバッグビルドをした
バイナリをリリースするようなものだ (VC++ のデバッグビルドでは、変数は 0xcdcdcdcd に
初期化される、らしい)。
というわけで、これまでは
- わたしは memset による初期化はしない
- 他人が memset するのは口出ししない (でも俺はしないけどね、くらいは言うかも)
- 何も知らない初心者には memset で初期化しろとは言わない (適切な文字終端管理が
できるようになることを願って)
というふうにしてきた。でもダブルスタンダードなので気持ち悪い。
世の中的にはどうなんでしょうね。
while (1){
char buf[256];
memset(buf, 0, sizeof(buf));
...
}
などと毎回メモリを 0 で塗りつぶす人がいるが、果たしてこれはよい習慣なのだろうか。
わたしは「適切に文字終端を管理していればこんな初期化は不要」派である。
しかし適切に文字終端を管理できない人はたくさんいる。そういう人にとっては、前回
ループの変数の内容が次ループにも引き継がれてしまう、という最悪の事態を避けるため
のよい方法なのだろう。実際、他人の書いたソースを眺めていて、memset がなかったら
落ちるなぁと思ったことは多々ある。
でもわたしには、ただのバグ隠蔽工作にしか見えない。VC++ でデバッグビルドをした
バイナリをリリースするようなものだ (VC++ のデバッグビルドでは、変数は 0xcdcdcdcd に
初期化される、らしい)。
というわけで、これまでは
- わたしは memset による初期化はしない
- 他人が memset するのは口出ししない (でも俺はしないけどね、くらいは言うかも)
- 何も知らない初心者には memset で初期化しろとは言わない (適切な文字終端管理が
できるようになることを願って)
というふうにしてきた。でもダブルスタンダードなので気持ち悪い。
世の中的にはどうなんでしょうね。
スポンサーサイト


