« Intelコンパイラ/ニンテンドーDS追加購入 | メイン | 断髪式/ThinkpadはAES未対応? »
2007年05月11日
不埒な悪行を斬舞/ギネスパイントの達人への道(未遂) |
出陣。先日発生したメモリ破壊調査。今日はキラーリクエストをみつけることができ、100%再現した。 unsigned intの変数で、通常3以上の数値が入ってくるところにロジックの誤りにより0が入ってきてしまった。関数内部ではその数値から1を減算する場合があり、ゼロで入ってきた場合は-1ではなく、42億(あるいは21億?)以上になってしまう。さらにこの変数はループカウンタの上限として使われており、膨大な回数ブン回ることになった。さらに悪いことにこのループ内部ではメモリの再配置をしており、ユーザメモリを超えて共有メモリも書き換えてしまった次第。
具体的なコードイメージはこのような感じ
int f(unsigned int uic, unsigned char* pt, ...) {
typedef {
int x;
int y;
}
PXY;
PXY p;
if(...) {
uic--;
}
p = (PXY*)pt;
//
for(i=0; i<uic; i++) {
p[i].x = ...;
p[i].y = ...;
}
:
}
ようやく悪のシナリオの全貌がつかめて安堵といったところである。
帰りにギネスパイントの達人続き。金曜のためか丸の内の三菱ビル地下の店(GASTORO-PUB COOPERS丸の内二丁目店)は人大杉で退散。有楽町で牛丼(期間限定330円)を食い、横浜へ移動。スカイビルYCATそばのバー(CockTailsBarMarceau)に入ろうとしたが、大音響でBGMが流れており、落ち着いて飲めなそうなのでこれまた敵前逃亡。最寄のスーパーでギネス缶(287円→259円)を買い自宅で3/4PINTとした。
F案件実装続き。カード決済インタフェースの実装。決済システムを利用すると課金されてしまうので、テスト用に決済シミュレータをつくっておく。また、通称夜景バグの再現に成功。日本語文字を引き回すときのエンコード漏れとわかり、即対処。
2008:
投稿者 onsenfan [ プログラミング, 独り言 ] : 2007年05月11日 23:33
この記事が役に立った/おもしろいと思ったら、ワンクリックで応援お願いします
トラックバック
このエントリーのトラックバックURL:
http://blog.odorokutamegoro.com/cgi-bin/mt/mt-tb.cgi/1898_3711832623307