2007/09/10
JavaScriptでくだらないバグ
JavaScriptで実にくだらないバグを書いてしまいました。
実際のコードは違いますが、簡単に言えば、次のように変数lenを使ったループの中で、(別のlenを使っているつもりで)lenの値を書き換えてしまっていました。
for (var i = 0; len = arr1.length; i < len; i++) { ... for (var j = 0; len = arr2.length; j < len; j++) { ... } }
ゼロから書いていればここまで自明なバグは起きない気がしますが、途中でのコードの書き換えで、ミスに気づきませんでした。
更に悲しいことに、バグの性質としては、以前Cで書いたバグと似たようなバグであることです(http://dev.ariel-networks.com/Members/inoue/pitiful-bug2.0)。半年周期で何かに憑かれてしまうのでしょうか。
[追記] 人間側のミスは同質ですが、言語仕様(JavaScriptにブロックスコープが無い)の違いのため、バグの現象は結構異なっています。
この手のイージーミスから身を守るには
- 気をつける
- ミスしにくい書き方にする(= ミスしやすい書き方を避ける)
- ミスをコンピュータに発見させる
という手があります。
最初の「気をつける」は却下です。気をつけてもミスする時はミスをするからです。バグへの対策で「今度から気をつけます」は最悪の対策です。
2番目の「ミスしにくい書き方にする」は悪くない手です。もっとも、分かっていてもやってしまうのも人間の一面です。
一番良いのは最後の「ミスをコンピュータに発見させる」手です。過去記事にあるように、Cの場合は、-Wshadowオプションを渡してgccに発見させるようにしました。上のJavaScriptのコードパターンに対して警告をするツールはありそうな気がします。理想は静的コードチェックですが、事情により、実行時にチェックする必要があります(一部、JavaScriptコード生成のコードがあるため)。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/pitiful-js-bug/tbping