(プログラムネタ) Flashの結構すごいバグを見つけた
2008年12月07日13:20
そこまでFlashを使い込んでいる人がいないから発覚してないのかもしれないけど、結構ハデに間違っているバグを見つけた。 まだ詳細は明らかになってないのだけど、ActionScriptである特定の書き方をすると値がおかしくなることがわかった。
その書き方とは
x[++i]++
という書き方だ。 最近のプログラマはあまりこういう書き方を好まないが、C言語を使っていた若干年配の人はこういう短い書き方を好む。 C言語は古くシンプルな言語なのでこの書き方でもいいのだが、新しい言語であるJavaScriptはもう少し複雑な背景があり、こういう省略された書き方をすると微妙な要素をはらむことがある。
試してみた。
// var a = new Object();
var a = new Array();
a[ 0 ] = 0;
a[ 1 ] = 1;
a[ 2 ] = 2;
var i=0;
a[i++] ++;
trace( a[0] );
trace( a[1] );
trace( a[2] );
このとき、a[0] は 本当は1にならないといけないのに、2 になる。 再現率は100%で、間違いなくバグだ。
Adobe社に英語でバグ報告してみようかな、と思う。
(こういう込み入った話を日本語で書いて日本の代理店に報告してもみんな理解できなくてもみ消されるだけなので、時間の無駄だ。)
その書き方とは
x[++i]++
という書き方だ。 最近のプログラマはあまりこういう書き方を好まないが、C言語を使っていた若干年配の人はこういう短い書き方を好む。 C言語は古くシンプルな言語なのでこの書き方でもいいのだが、新しい言語であるJavaScriptはもう少し複雑な背景があり、こういう省略された書き方をすると微妙な要素をはらむことがある。
試してみた。
// var a = new Object();
var a = new Array();
a[ 0 ] = 0;
a[ 1 ] = 1;
a[ 2 ] = 2;
var i=0;
a[i++] ++;
trace( a[0] );
trace( a[1] );
trace( a[2] );
このとき、a[0] は 本当は1にならないといけないのに、2 になる。 再現率は100%で、間違いなくバグだ。
Adobe社に英語でバグ報告してみようかな、と思う。
(こういう込み入った話を日本語で書いて日本の代理店に報告してもみんな理解できなくてもみ消されるだけなので、時間の無駄だ。)
コメント一覧
あび 2008年12月08日 02:45
いや、ここまで再現ケースを簡素化できていれば、込み入った話でもないのでは?とも思う。
でもまあ、開発元が米国なら、直接報告した方がいいとは思うけど。別の書き方で同じ処理を実装して問題を回避できるのであれば、修正の優先度は下げられちゃうだろうし、次期バージョンで修正対応って事になるのかなあ?
でもまあ、開発元が米国なら、直接報告した方がいいとは思うけど。別の書き方で同じ処理を実装して問題を回避できるのであれば、修正の優先度は下げられちゃうだろうし、次期バージョンで修正対応って事になるのかなあ?
おかあつ 2008年12月08日 03:46
わかんないけど、経験上、こういう根本的なバグを報告しても信用されない様な気がするんだよね。 何か面倒だ。 経験上、何か嫌な予感がする。
しかし、こうやってみるとすっきりしてるけど、ここまで煎じ詰めるのホント難しかった。 このバグを追跡するの一週間がかりだった。 ホント追跡が難しいバグだった。
最新版はウェブサーバーが忙しすぎてダウンロードできなかったんだけど、バージョン8までは同じバグがあることを確認できたので、多分かわってないと思う。 多分既知じゃないと思う。 FirefoxのJavaScriptエンジンにはこのバグはなかった。
この書き方って、内部的な処理として a[++i] が2回評価される必要があって、iが増加するという副作用が発生しないように工夫する必要があるんだよね。
しかし、こうやってみるとすっきりしてるけど、ここまで煎じ詰めるのホント難しかった。 このバグを追跡するの一週間がかりだった。 ホント追跡が難しいバグだった。
最新版はウェブサーバーが忙しすぎてダウンロードできなかったんだけど、バージョン8までは同じバグがあることを確認できたので、多分かわってないと思う。 多分既知じゃないと思う。 FirefoxのJavaScriptエンジンにはこのバグはなかった。
この書き方って、内部的な処理として a[++i] が2回評価される必要があって、iが増加するという副作用が発生しないように工夫する必要があるんだよね。