私はこれを共有しなければなりませんでした:
条件演算子に関連する次の些細なエラーで、丸2日間ハングアップしました。
簡単な修正ですが、知りたいのは次のとおりです。
- バグのあるコードがコンパイルされたのはなぜですか?
- バグは何をしていましたか?
- 追跡するのがとても大変だったのはなぜですか?
バギーコード:
std::map<int, some_class> my_map;
int key_ctr = 0;
//...
std::map<int, some_class>::iterator it_next =
key_ctr == 0 ?
it_next = my_map.begin() // BUG!!!
:
it_next = --my_map.end(); // BUG!!!!
// .....
明らかに、私は条件演算子を間違って書きました。私がこのバグを見つけて修正したとき、Eveyrthingは完全に正常に機能します。
正しいコード:
std::map<int, some_class> my_map;
int key_ctr = 0;
//...
std::map<int, some_class>::iterator it_next =
key_ctr == 0 ?
my_map.begin() // CORRECTED!
:
--my_map.end(); // CORRECTED!
私のプログラムは、バグのある部分に近づくと、まるで無限ループにあるかのようにぶら下がっていました。valgrindで実行すると、次のようなものが得られました
....
==24570== Warning: set address range perms: large range [0x1a7731000, 0x1c5f79000) (defined)
==24570== Warning: set address range perms: large range [0x1c5f79000, 0x1e47c1000) (defined)
==24570== Warning: set address range perms: large range [0x1e47c1000, 0x203009000) (defined)
==24570== Warning: set address range perms: large range [0x203009000, 0x221851000) (defined)
.....
==3733== More than 10000000 total errors detected. I'm not reporting any more.
これはまったく役に立たず、間違ったディレクターを指さしました(どういうわけか、ヒープに割り当てすぎていると思いました)。
また、
- バグのあるコードがコンパイルされたのはなぜですか?
- バグは何をしていましたか?
- 追跡するのがとても大変だったのはなぜですか?
子供たちに感謝します。