愛媛県の電子入札システム、最低制限価格がソースに丸見え
愛媛県は12日、県発注の土木工事などに導入している電子入札システムについて、入札前に最低制限価格が見えてしまう不具合があった、と発表した(asahi.comの記事)。
このシステムは2007年4月に導入されたもので、開発元はNEC。今月9日の入札で、最低制限価格と同額の入札があったことから応札した業者に確認したところ、ソース上に最低制限価格が見えていることが判明したという。問題発覚を受け、県は今後一ヶ月に予定していた入札を中止した。
元記事だと若干わかりづらいが、どうもWebシステムで、値がhiddenか何かに書かれていたようである。
情報元へのリンク
barrinの日記: コンパイラがだす警告には正しく対処せよ 1
間違ってもキャストでごまかすことなかれ。
これはワーニングではないですが、const int の配列の配列へのポインタを宣言できなくて、intの配列へのポインタにキャストされてるのをみて目が点になったことがあります。
ほかによくあるのが関数の引数にキャストをつかっているもの、プロトタイプ宣言の意味が。。
barrinの日記: シンタックスシュガーは良く味わおう
シンタックスシュガーとはその言語でよく使う構文だから言語設計者が親切に設定してくれているものなので、これを利用しない手はない。C言語の関数名、配列名の式での扱いを理解してないせいか、
int foo(int *p, int (*f)(int))
{
return (*f)(*(p+100));
}
とかわざわざ読みくい書き方をしているコードを見ることがある。素直に
int foo(int *p, int (*f)(int))
{
return f(p[100]));
}
と書けばいいのにね。他にも(*p).hoge とか、->演算子の立場がない...
コメント: 社外とやり取りするならquilt+gitはお勧め (スコア 1) 3
cvs annotate とかをプリントアウトするのはどうでしょう。
他人にコードを渡すときももらうときもパッチになっていれば
適用・除外が楽なのでquilt+gitはかなりお勧めです。
ファイル名が一種の更新履歴になるし。
barrinの日記: 書いてはいけないコメント 3
良いコメントはプログラムの理解を助けるが、悪いコメントは理解を妨げる。
悪いコメントの典型例はコードを翻訳したコメントだ。情報量としてまったく増えていないし、
バグフィックスやメンテナンスでコードとずれが起きたときには嘘が書いてあるコメントになってしまう。
変更履歴をコメントに残すのは構成管理ツールを使っていないことを宣伝するようなものだ。
処理の塊に名前をつけたいときにはコメントではなく関数にしよう。
foo()
{
/* goo処理 */
....
/* foo処理 */
....
}
コメント: GCCにパースさせればできるかも (スコア 1) 3
オプティマイズの前後の中間形式の差分から検出するか、いっそGCCに手を突っ込んでその辺のサジェスチョンを出すようにするのがいいかも、
実行ファイル+共有ファイブライブラリを読み込んでクロスリファレンス出すツールがあれば、一箇所からしか呼ばれてない関数、読み込みしかされない定数などを検出できるかも、関数のインライン化は常に早くなるわけでもないのでコンパイラに任せてしまうのが吉かと。
#ヘッダファイルに関数定義がもれるのが嫌いなので。
barrinの日記: 公開しなくてよい情報は隠そう 3
ローカルな定数宣言や変数宣言が書いてあるヘッダファイルを時々見かける。
ヘッダファイルを字義通りプログラムの最初の方に書くものを置くファイルと考えてるのだろうか。
余計な情報が漏れると、それに依存した利用をされる可能性があり、
マーフィーの法則にしたがって、利用されてしまう。
一度利用されてしまえば、ローカルであったはずの定数はグローバルになってしまい、
ローカルな都合では変更ができなくなってしまうか、変更したときに予期せぬバグをもたらす。
表に出さなくてよいものは徹底的に隠そう。
コメント: 一行関数 (スコア 1) 2
昔I/Oをいかに見やすくコーディングするか
レジスタを全部#defineしてみたり、ビットフィールドにしてみたり試行錯誤してました、結局
#define XXX(x) (volatile unsigned long *)(IO_BASE + XXX_TOP + (x))
/* XXXはデバイス名 */
void XXX_on(void) { XXX(0x00) = 1; }
void XXX_off(void) { XXX(0x00) = 0; }
と一行関数にするのが、情報隠蔽、ハードウェア仕様書とのつき合わせ、
上位層からの見た目ともによいという結論になりました。
行数にこだわらず、名前をつけれる処理は関数にしてしまうのがよいかと。
Cだと複数の戻り値のある関数をかけない
構造体やバッファのポインタを渡して、そこに書き込むようにしますねえ。
inline化できれば効率も下がらないし。
コメント: Re:密結合の実装例と比較とか? (スコア 1) 2
私はすれっからしになってしまったので、大変参考になりました。
オブジェクト指向でも、あるメソッドをどのクラスに置くかで
より粗結合になったりします。
ぐぐったら↓のサイトをみつけました。
http://www.ogis-ri.co.jp/otc/hiroba/technical/Cohesion_Coupling/Cohesion_Coupling.html
これを理解してもらえればいいのですが、いかんせん長い。。。