ループにおいて初期化を忘れた場合
内部仕様が分からない関数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); }