<< 前 ホーム 次 >>

bakaid: 20080121

いやぁ、笑った。

こないだ『なんとなくはダメ!』って書いたばっかだけど。
まさに『なんとなく』としかいいようのないバグに悩ま
された。ちなみに、これは自分が書いたコードじゃない
けどね。C++の話なんだけど。

デバッガで追ってると、ほんとに『いつのまにか』メモリが
書き変わってる。

最初はオブジェクトのコピーで失敗してんのかと思った。
で、とりあえずコピー・コンストラクタというか、そう
いうsetterを用意してみたんだけど。それでも変わる。
いつのまにか。

で、たまたまOnKillFocusが怪しい気がした。ちょうど
ダイアログを閉じるところで現象が起きてたから。で、
デバッガでブレイク・ポイント張っとくと、案の定、
引っかかった。MFCってマルチスレッドなの?

これでタイミングは分かったんだけど。まだ正体までは
突き止められなかった。やっぱりこっちでも露骨にメモリを
書き換えてるようなとこは見当たらない。

で、しばらくウダウダとコードを眺めてたら、生の配列で、
引数で渡されたインデックスでアクセスしてるとこが目に
入ってきた。しかも:

void setValue(int n, int value) {
    array[n - 1] = value;
}

みたいなコードになってた。引っかけてみると、やっぱり
nがゼロのときがあった。

まぁ、わかってみれば単純なミスだったわけど。こういう
のは、もう防ぎようがないっていうか。いや、防ぎようは
あるんだけど、それってプログラマ個人の心がけとか、
そういうレベルでしか防げないことだから。

たとえば、いくらvectorを使いましょうっていっても、
それを守るかどうかは本人次第なわけだし。

これはたまたまC++の話だったけど。でも、他の言語でも
おんなじだよね。それぞれの言語にはそれぞれの落とし
穴があるし。まぁ、C/C++は多いほうだけど (笑)。

だから、こういうのは自分で痛い目にあって、身に染み
こませて覚えるしかないんだよなぁ。

で、こういうのをバッドノウハウの一言で片づけるわけ
にはいかないんだと思う。結局、システムが落ちたら
ダメなんだし、システムが落ちるのはまさにこういう
ところで落ちるんだし。というか、上のみたく、落ち
なくて、不正な状態なまま動いちゃうっていう一番恐い
パターンもあるわけだから。

本家Permlink

<< 前 ホーム 次 >>


Copyright © 1905 tko at jitu.org

バカが征く on Rails