nabeshinによる
2008年05月21日 12時29分の掲載
プログラム洗濯機部門より。
プログラム洗濯機部門より。
あるAnonymous Coward 曰く、
組み込み系の開発では様々なベンダーが次世代静的プログラム解析ツールともいえる製品を開発し、世に送り出している(本家/.記事)。これらツールはNULLポインタ参照やバッファオーバーフローの脆弱性、競合状態やメモリリークなどを検知できるとされている。本家では、Linuxカーネルで使われているsparseのほか、FindBugsや、DoubleCheck、Identify critical defectsなどといったツールが話に出ている。
実際、次世代静的プログラム解析ツールを導入することで開発方法やテストサイクルに変化はあるのだろうか? 新しい解析ツールは既存のものよりそんなに実力が違うのだろうか? 諸氏のご意見を求む。
関連ストーリー
null参照の考案は10億ドル単位の過ち? 87 コメント
この議論は賞味期限が過ぎたので、保存されている。
新たにコメントを書くことはできない。
出てくる警告にどう対処するのかが問題 (スコア:5, すばらしい洞察)
# しかも、周りがヤイのヤイの言っても、今まで一度も直らなかったぐらい
# 上から下まで、ものを判っていない。
というわけで、このようなツールを使ったからどう、という事ではありません。
このようなツールの出力にどう対処するかが問題。また、このようなツールが
出してくる警告の量から、プログラム改善にかかる時間を正確に見積もる、などの
マネージメント能力も大事でしょう。
fjの教祖様
Re:出てくる警告にどう対処するのかが問題 (スコア:2, すばらしい洞察)
# みたいなー。
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:4, おもしろおかしい)
「わあ!見る見る消えていきますね!」
# 符号無し整数型の変数と負数のエラー定数を比較した、あの頃の記憶
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:3, おもしろおかしい)
警告が出た行を丸ごと削除するという荒技が・・・・
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:2, 興味深い)
そしてそういう人たちは、「何が問題なのか」をいくら説明しても馬耳東風なのです。
「で、どうすればいいって~~??!」
一瞬「この世から消えろ」と「プログラマ辞めろ」とどっちを先に言おうか悩んだのは秘密だ。
そして実際に言ったせりふは…
「… あぁ… どうやら天もあなたの今の発言には怒り狂ったようですね。
寝言は寝て言うように」
# fjの教祖様の怒りが頂点に達すると、雷が天から降り注ぐ…ときもあるのだ。
fjの教祖様
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:2, すばらしい洞察)
完成したコードにツールを通したあとで警告を減らすために修正するとけっこうひどいことになりますが、この手のツールに引っかからないようなコーディングスタイルを身に着けるというのはかなり有効ではないかと思います。
なので、製品のチェックに使用するなら、コーディング工程のかなり早い段階(クロスレビュー前)で使用し、既存のコードへの使用は傾向分析等を主にするのがいいんじゃないですかね。
これなら、逃げでごまかすよりも、警告の出にくいコードを書くようになると思うんですが。
//ソリッドファイター完全版 [fukkan.com]復刊賛同者募集中/
親コメント
使う側の人間は少数派ですか? (スコア:3, 興味深い)
静的解析ツールについては組み込み系の中の車両系では普通に用いられています。 使う理由としては
- 製品に不具合が発生すると最悪人命に関わる自体に発展するおそれがあるので可能な限り不具合を発見したい
- 人間では検査の質にムラが生じるが、ツールによる自動検査だとムラが生じない(新入社員でも、ベテラン社員でも一定の品質が確保できる)
などが上げられます。特に近年、静的解析ツールに注目が集まっているせいか、ET2007でのチュートリアルセッション( http://www.jasa.or.jp/et/ET2007/conference/info_ts.html#TS-6 [jasa.or.jp])でもアイシン精機の方が講演中で静的解析ツールの導入・活用方法について触れられています。
私の知っているメーカーでは、静的解析ツールが出力した警告の報告・確認事項・対処(対策)法をマニュアル化して徹底させています。 しかし、静的解析検査はインフルエンザのワクチンのようなもので、一部の不具合の混入を防止するための手段の一つでしかなく、すべての不具合を検出できるわけではありません。 でも、最後は必ず複数の人間でコードレビューを行います。
また、車両系では製品を欧州に輸出するためには、開発プロセス中でMISRA-Cを用いなければならないようなので、選択したルールを満たしているかどうかの自動チェックにも用いています。
ツールを利用するタイミングですが akiraani さんが述べられているように、短時間で解析結果が出せるツールを
していますし、ツールによっては統合開発環境(Eclipse/HEW等)に組み込めるので、コンパイルの前にチェックを必ず行わせるようにしています。また、検出率が高いが実行時間が長いツールも用いており、こちらは金曜日の夕方に解析を開始させると月曜日の朝のミーティングの前には結果が出ます。 そのため月曜日は検出された問題点に対する対処などを話し合っています。
ほかに、静的解析の他にもデッドロック発生の可能性やタイミングの正しさを確認するための動的解析環境の利用もマニュアルで指示されており、開発プロセス中でツールを用いるのが当たり前になっています。
----(中に近い人なので話せる範囲で。)
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:3, 興味深い)
int func()
{
lock();
...
if (statement_stands)
{
/* ここでロックをはずすのを忘れる */
return;
}
...
unlock();
return
}
とか.
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:2, 興味深い)
MISRA-Cってのは自分で適切なルールを選んで適用するものです。
ですから、関数途中のreturnを禁止するとうまくない理由をちゃんと説明して
そのルールを外してもらうのがMISRA-Cのやり方です。
外してもらえないのなら、あなたの説明が悪いか、ボスand/or顧客がアレなのか、どちらかあるいは両方です。
MISRA-Cは正しいのですw
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:2, すばらしい洞察)
.
年をとってもコーディングを続けられる(続けざるを得ない、ではなくね)人たちの多くは「最初の頃からずっと使い続けられているエディタ」である Emacs や vi を使っている人が多いと思います。
# 私も Final を一時期使っていたが、結局それらは生き残らなかった…
一方で、若い人たちの多くは Eclipse を使っているでしょう。
と言うことは、単純に考えても Eclipse 側には「若手が多い」というバイアスがかかります。
プログラミングもやはり経験値がある程度ものを言いますので、「若手が多い」環境はどうしても品質が下がる、という傾向が出てしまいます。
コーディングを「できなくなる」人たちと言うのは、レベルが低い側ほど脱落率が高いでしょう。と言うことは、同じ世代のプログラマは年齢が上がるほど、平均レベルが高くなるはずです。
.
と言うわけで、20年ほど前に「vi/Emacsなんか使っている奴らのコードは使い物にならん」と言われたのと同じ意味において、今の Eclipse 使いのコードは醜い側に広く分布していると思われます。あと20年もすれば Eclipse よりも便利なツールが現れて新人はみなそちらを使うようになり、きっと言うようになるでしょう。
『xxxx を使っている奴らのコードは醜くていかん』
fjの教祖様
親コメント
Re:出てくる警告にどう対処するのかが問題 (スコア:2, すばらしい洞察)
>「最初の頃からずっと使い続けられているエディタ」である Emacs や vi を使っている人が多いと思います。
多くかどうかは知らないけど、Emacsを使ってる人はEclipse『も』使ってる人が結構いますよ。
Emacsを使い続けているのは「最初の頃から使っているから」「慣れているから」などという
理由ではなく、エディタとしてはEmacsの方が遙かに優れているからです。
#Eclipseは統合環境である以上はエディタが貧弱なのは当たり前。
より適切な道具を取捨選択して使った結果、今でもエディタにはEmacsを選択する。
それだけのことです。
>と言うことは、単純に考えても Eclipse 側には「若手が多い」というバイアスがかかります。
あまりに単純化しすぎでは。
上にも挙げたように、Emacsを使ってる人がEclipseも使っていることが多々あります。
Eclipseから入った若手でも、(おそらくごく一部ではあるが、)Emacsを使ってる人もいます。
#中にはずっとメモ帳でやってきて、最近になってやっとEclipseを覚えた
#『経験豊富な熟練者』もいるかもしれないけど、一緒にやってくのには不安を覚える。
Eclipseから入り、そしてそれ以外を知らない人の中には、自分では何も考えず、ツール
が出す指示に従って切り張りする人がいます。それでエラーは出なくなるし、コンパイルも
通ります。でもそれはプログラミングと呼ばれる作業とは全く異なるものでしょう。
エディタは(たとえそれがEmacsであっても)何も指示してくれないので、自分で考えない人、
考えられない人は最初の段階で躓きます。またそれを自分で自覚できます。何が分かって
ないのかに気付くことが、学習への第一歩です。
便利すぎる道具は、初心者が学習する時には逆効果になりかねません。
親コメント
Re:いまだにC/C++を使っているのが問題 (スコア:4, おもしろおかしい)
親コメント
Re:いまだにC/C++を使っているのが問題 (スコア:2, すばらしい洞察)
C/C++が採用される(活かされる)のだと思いますが。
問題と思うなら何が問題で、言語にどのような仕様があれば解決するのか
説明して頂けないでしょうか。
#こういうことを尋ねると大概ライブラリの問題など言語に関係ない方向に進む。
親コメント
そこそこ出来る人による使用例を求む (スコア:2, すばらしい洞察)
「ダメダメな人にでも使わせるとダメダメなプログラムがそれなりの出来になるツール」ではなくて、
「それなりの人に使わせることでそれなりなプログラムがなかなか良い出来になるツール」なのでしょう。
「すごい人に使わせてもすごいプログラムが完璧なできになるツール」でもないと思います。むしろこの場合は、ツールの出来によっては「見当はずれな警告しか出ないでストレスの元にしかならないツール」であるかもしれません。
「こーんなヤツにこんなツールを使わせても役には立たないよ!」という話ばかりでなく、
こちらの話も聞きたいのですが。「甲のツールを使っていたらこんな警告が出て、こんなバグを見つけたよー」とかいう話もよろしく。
Re:そこそこ出来る人による使用例を求む (スコア:2, 参考になる)
ごくまれに、なんで警告が出るんだ出るわけないだろってこともあります。
警告の内容は例えば
1.int型に対しビット演算を行うと「整数型に対してビット演算を行っています」ってな感じの警告が出ます。
この場合unsigned int型でビット演算を行えば警告は出ません。
2.もしchar型の範囲が-127~128だった場合
0xffを代入しようとした場合これも警告が出ます。
型の範囲外の値を代入しようとしているためです。
charの範囲は環境により異なるためなんともいえませんが。
3.short型(16ビット)にint型(32ビット)の変数を代入させた場合「暗黙のキャストが行われます」とか出ます。
この場合、short型にキャストするれば警告が消えます。short型の変数に入れて良いかもチェック巣r必要も出てきます。
ただ、int型(32ビット)にshort型(16ビット)の変数を代入した場合は警告は出ません。
(ほかのツールなら警告が出るかもしれませんが)
4.unsigned int型のiに対し
for(i=100;i>=0;i--)
なんて書いた場合も警告が出ますね。「for文の条件は常に真です。」といった内容だったかと。
5. int data;
char tmp = 5;
data = tmp << 16;
これも警告が出ます。警告の文面は忘れましたが
tmpの型の範囲外へシフトを行っており情報が失われる。だったかな?
tmpは最大8(7?)ビットしかシフトできないためです。
この場合
data = ((int)tmp) << 16;
とすればよかったと思います。
6. #define AAA(data,val) val = data
これも警告が出ます。
#define AAA(data,val) (val) = (data)
とする必要があります。
7. #define BBB(data1,data2,val) \
{ \
(data1)=(val); \
(data2)=(val); \
}
この警告は「valは2度以上使用されます」といった内容だったかと。
BBB(a,b,c++);
と書いた場合cが意図していない内容になるかもしれないためだと思います。
もっと深い警告もありますが今手元にデータが無いので内容覚えてません。
かなりうろ覚えなため間違ってるかもしれません。
そもそも「こんなコード書くなよ」といわれればそれまでですが。
親コメント
Re:doxygen(古い? (スコア:2, おもしろおかしい)
親コメント