ループにおいて初期化を忘れた場合

内部仕様が分からない関数hoge()があり、それを次のプログラムのように使用する場合を考えます。

struct arg1 {
  int a;
  char b;
};
int arg2;
void hoge(int *arg1, arg2);

init_arg1(&arg1);
init_arg2(&arg2);

while (1) {
  hoge(&arg1, arg2);
}

ここでバグが発生する可能性があります。関数に変数の参照を渡す場合は、内部で変数の内容が書き換えられている可能性があり、そのまま使うと予期せぬ結果を招くことがあります。特にループ内部が複雑になってくると、このようなミスをしやすくなります。

解決策は…

  • ループを回るたびにしっかり初期化する。
  • もしhoge()を書き換えることができるならば、引数を値渡しに変更する。
  • 変数のコピーを引数として渡す。

などがあります。

while (1) {
  init_arg1(&arg1);
  hoge(&arg1, arg2);
}