アカウント名:
パスワード:
板情報を配信するプログラムは本来、1銘柄当たり1280バイトの作業用メモリー領域を2万8000銘柄分、合計3万5000Kバイト確保するよう記述しなければならない。だが、1銘柄当たりのメモリー領域を誤って4バイトとしてしまったため、プログラムは本来の320分の1の109.375Kバイトしか確保しなかった。結果として89銘柄以上の板情報の問い合わせが同時に発生すると、作業用メモリーが足りなくなり、情報配信システムがダウンした。
typedef struct _Hoge Hoge;typedef struct _Hoge * HogeP;struct _Hoge { char something[1280];};
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
ちょっと違う (スコア:4, 参考になる)
データ容量のサイズが28000銘柄分のはずが88銘柄分しか確保できてなかった。
http://itpro.nikkeibp.co.jp/article/NEWS/20080722/311271/
Re:ちょっと違う (スコア:5, 参考になる)
Re:ちょっと違う (スコア:1)
Re:ちょっと違う (スコア:1, 興味深い)
皆さん現役の方ですよね。世の中にはこの手のバグを飼ってるソフトが多数出荷されてるってことになりますか。
Re:ちょっと違う (スコア:1, 興味深い)
同時に、東証のシステムが 64bit 化されていない事も推測できる、と w
Re: (スコア:0)
プログラマも人間なんで、間違いはいくらでもやります。
でも、特に大きなシステムの場合、ソースコードを複数人で確認するはずで、
確認していればこういう記述ミスレベルのものは、大抵発見できるですよ。
もちろんその前後にテストだってやるし。
作りこむことは多数あっても、出荷する前に見つかって直ってます。
ええ、大抵は。
#「データ容量のサイズ」という変な表現を直したかった。
Re:ちょっと違う (スコア:1, おもしろおかしい)
そんなプロジェクトありません(笑)
#笑っちゃいけないところだけど。
Re:ちょっと違う (スコア:1)
>そんなプロジェクトありません(笑)
一度に複数人で確認する事は無いけど、3ヶ月ごとに別の人がメンテする案件というのはありがち。
まあ、今回に限って言えば、いかにコーディングを正確に行ったかよりも、
境界値・例外値・適正値の検証不足が原因でしょう。
人の数より、質の問題。
一見コードは正しいけど、運用でコケるって類のミスを防ぐには、
PGが複数人居て見ても気がつきにくい、なぜなら業務のプロでないから。
いわゆるユーザー系SIであれば、業務にも通じている人間が常時いるけど、
大規模アプリの全モジュールをチェックできる人数抱えていない罠。
#88銘柄にしろ28000銘柄にしろ、上限値を超えた時の例外処理にも問題があるように思える。
Re: (スコア:0)
だが、富士通から納入されている売買システムはCOBOLだから今回の先物システムもCOBOLじゃないの?
COBOLでヌルポやポインタ記述ミスは起こらない。
そこで他の方が書かれているようにストレステストじゃなくてエラー処理検証用に最大数を88(適当な数字)にして
エラーシーケンスのテスト後戻し忘れじゃないの?
これは受け入れ検査時だと思うので東証側のシステム担当者が悪い? 保身の為にメーカに責任を負わせると次のシステムも
富士通に決定。
原因不明と言うよりも、”ヌルポ! ガッ!”って言っとくほうが恥ずかしいバグですが誰もが納得して修正後は根治されたと納得できる。
Re: (スコア:0)
いうことで…。物凄い寒気がするんですが。
Re:ちょっと違う (スコア:1)
それはそれで怖いですな。小説のネタっぽいですが。
あぁそうそう、そうですよだから僕は三流プログラマなんですよ!
決して怠惰で勉強してないわけじゃないんですよ!
Re: (スコア:0)
Re:ちょっと違う (スコア:1)
sizeof(DataType) のつもりが sizeof(DataType*) になってたとか?
…っていうのは、やっちゃったことあります。マクロ化してて、引数の型を間違えたりとか…
#define alloc(type,count) malloc(sizeof(type)*(count))
DataType *p = alloc(p, count);
ってな感じのコードだったかな。
Re:ちょっと違う (スコア:1, 参考になる)
そういう間違いを防ぐため、以下のようなマクロを使うことにしてます。
#define MALLOC1(p) ((p) = malloc(sizeof(*(p))))
#define MALLOCN(p,n) ((p) = malloc_array((n), sizeof(*(p))))
なお関数 malloc_array() 内では、整数オーバーフローのチェックが必要です。
親記事の alloc() マクロは、その点でも問題がありますね。
Re:ちょっと違う (スコア:1, すばらしい洞察)
これって最大値のチェックが抜けていたって事でしょ?
原因は確かに設定ミスだけど、この程度なら、ちゃんとテストすれば発見出来る障害だと思うんだけど。
Re:ちょっと違う (スコア:2, 興味深い)
受け入れ試験に「通って」て、悪意のある挙動でもないのに損害賠償ってのはなぁ...。
#「設定」だからオペミスの可能性もあるけどな。
富士通がんばれ! (スコア:0)
こういうとこでは金を取られる、なんて世界じゃSI屋さんもやってられないでしょ。
こんなの。
#東証のシステムの要求仕様がいい加減だったかどうかは知りません。
ウチが受けた仕事(もちろん東証とは関係ない組込みの仕事)でも要求仕様には機能
の内容すらロクに書いてないのに、いざ納品したら「画面が違う」(そもそも仕様
書のどこにも画面デザインなんて書いてないよ~~)とか、「HTTPプロトコルでの
通信」って書いてあるのに、「動かないのがわかってから仕様書が登場したRFCと
はかなり違うその会社独自のHTTPプロトコル」だったりしたりして、えらい目に
あった。
(そんな状況でこっちが金欲しいくらいなのに「納期遅れだ、機会損失を補償しろ」
とかほざくし)
Re: (スコア:0)
とくにこの程度の、ロジックすら絡んでない話だと、レビューなりなんなりで見つからないとねえ。
Re:ちょっと違う (スコア:1)
そうだとしても「テストの段階で発見できたかもしれないミス」だと思うぞ。
うじゃうじゃ
Re:ちょっと違う (スコア:1)
構造体実体のサイズを使うべき所で、構造体へのポインタのサイズを使ってしまったのでは…。
上記のような定義があって、
「sizeof (Hoge) * 28000」とすべきところを、
「sizeof (HogeP) * 28000」としてしまった…、に1票。
Re: (スコア:0)
にしたって、信じられないミスではありますね。
Re: (スコア:0)
証券コードは5桁以上もあります。
伊藤園第1種優先株式 [yahoo.co.jp]
Re: (スコア:0)
4バイトって事はポインタなんじゃない?
例えばこんな感じ↓にしちゃったとか。
typedef struct {
・・・
} meigara;
// meigara *meigaraBuf = new meigara[28000]; //正
meigara *meigaraBuf = new meigara*[28000]; //誤
Re: (スコア:0)
Re: (スコア:0)