ページ内ジャンプ:

アレゲなニュースと雑談サイト

nabeshinによる 2008年05月21日 12時29分の掲載
プログラム洗濯機部門より。

あるAnonymous Coward 曰く、

組み込み系の開発では様々なベンダーが次世代静的プログラム解析ツールともいえる製品を開発し、世に送り出している(本家/.記事)。これらツールはNULLポインタ参照やバッファオーバーフローの脆弱性、競合状態やメモリリークなどを検知できるとされている。本家では、Linuxカーネルで使われているsparseのほか、FindBugsや、DoubleCheckIdentify critical defectsなどといったツールが話に出ている。

実際、次世代静的プログラム解析ツールを導入することで開発方法やテストサイクルに変化はあるのだろうか? 新しい解析ツールは既存のものよりそんなに実力が違うのだろうか? 諸氏のご意見を求む。

この議論は賞味期限が過ぎたので、保存されている。 新たにコメントを書くことはできない。
表示オプション しきい値:
  • 警告を無視したり、出てくる指摘に「逃げる」ようなコードで対処するプログラマばかりの世界では、まったく品質は向上しない。そして困ったことにそういう所こそ、品質を向上させなくてはいけない元凶だったりする。

    # しかも、周りがヤイのヤイの言っても、今まで一度も直らなかったぐらい
    # 上から下まで、ものを判っていない。

    というわけで、このようなツールを使ったからどう、という事ではありません。
    このようなツールの出力にどう対処するかが問題。また、このようなツールが
    出してくる警告の量から、プログラム改善にかかる時間を正確に見積もる、などの
    マネージメント能力も大事でしょう。
    --
    fjの教祖様
    • もっとも、そういう所ではその手のツールの導入以前に、まず「-Wall -Werror」から始める必要がある。
      # みたいなー。
    • >このようなツールの出力にどう対処するかが問題。

      完成したコードにツールを通したあとで警告を減らすために修正するとけっこうひどいことになりますが、この手のツールに引っかからないようなコーディングスタイルを身に着けるというのはかなり有効ではないかと思います。

      なので、製品のチェックに使用するなら、コーディング工程のかなり早い段階(クロスレビュー前)で使用し、既存のコードへの使用は傾向分析等を主にするのがいいんじゃないですかね。
      これなら、逃げでごまかすよりも、警告の出にくいコードを書くようになると思うんですが。
      --

      //ソリッドファイター完全版 [fukkan.com]復刊賛同者募集中/

      • whelp (25685) : 2008年05月21日 20時06分 (#1347860)

        静的解析ツールについては組み込み系の中の車両系では普通に用いられています。 使う理由としては

        • 製品に不具合が発生すると最悪人命に関わる自体に発展するおそれがあるので可能な限り不具合を発見したい
        • 人間では検査の質にムラが生じるが、ツールによる自動検査だとムラが生じない(新入社員でも、ベテラン社員でも一定の品質が確保できる)
        などが上げられます。

        特に近年、静的解析ツールに注目が集まっているせいか、ET2007でのチュートリアルセッション( http://www.jasa.or.jp/et/ET2007/conference/info_ts.html#TS-6 [jasa.or.jp])でもアイシン精機の方が講演中で静的解析ツールの導入・活用方法について触れられています。

        私の知っているメーカーでは、静的解析ツールが出力した警告の報告・確認事項・対処(対策)法をマニュアル化して徹底させています。 しかし、静的解析検査はインフルエンザのワクチンのようなもので、一部の不具合の混入を防止するための手段の一つでしかなく、すべての不具合を検出できるわけではありません。 でも、最後は必ず複数の人間でコードレビューを行います。

        また、車両系では製品を欧州に輸出するためには、開発プロセス中でMISRA-Cを用いなければならないようなので、選択したルールを満たしているかどうかの自動チェックにも用いています。

        ツールを利用するタイミングですが akiraani さんが述べられているように、短時間で解析結果が出せるツールを

        コーディング工程のかなり早い段階(クロスレビュー前)で使用
        していますし、ツールによっては統合開発環境(Eclipse/HEW等)に組み込めるので、コンパイルの前にチェックを必ず行わせるようにしています。

        また、検出率が高いが実行時間が長いツールも用いており、こちらは金曜日の夕方に解析を開始させると月曜日の朝のミーティングの前には結果が出ます。 そのため月曜日は検出された問題点に対する対処などを話し合っています。

        ほかに、静的解析の他にもデッドロック発生の可能性やタイミングの正しさを確認するための動的解析環境の利用もマニュアルで指示されており、開発プロセス中でツールを用いるのが当たり前になっています。

        ----

        (中に近い人なので話せる範囲で。)

    • あると思います。ただし、お尋ねのような意味とは違いますが。

      .

      年をとってもコーディングを続けられる(続けざるを得ない、ではなくね)人たちの多くは「最初の頃からずっと使い続けられているエディタ」である Emacs や vi を使っている人が多いと思います。
      # 私も Final を一時期使っていたが、結局それらは生き残らなかった…

      一方で、若い人たちの多くは Eclipse を使っているでしょう。
      と言うことは、単純に考えても Eclipse 側には「若手が多い」というバイアスがかかります。

      プログラミングもやはり経験値がある程度ものを言いますので、「若手が多い」環境はどうしても品質が下がる、という傾向が出てしまいます。
      コーディングを「できなくなる」人たちと言うのは、レベルが低い側ほど脱落率が高いでしょう。と言うことは、同じ世代のプログラマは年齢が上がるほど、平均レベルが高くなるはずです。

      .

      と言うわけで、20年ほど前に「vi/Emacsなんか使っている奴らのコードは使い物にならん」と言われたのと同じ意味において、今の Eclipse 使いのコードは醜い側に広く分布していると思われます。あと20年もすれば Eclipse よりも便利なツールが現れて新人はみなそちらを使うようになり、きっと言うようになるでしょう。

      『xxxx を使っている奴らのコードは醜くていかん』
      --
      fjの教祖様
      • firewheel (31280) : 2008年05月21日 22時35分 (#1347932)
        >年をとってもコーディングを続けられる(続けざるを得ない、ではなくね)人たちの多くは
        >「最初の頃からずっと使い続けられているエディタ」である Emacs や vi を使っている人が多いと思います。
        多くかどうかは知らないけど、Emacsを使ってる人はEclipse『も』使ってる人が結構いますよ。

        Emacsを使い続けているのは「最初の頃から使っているから」「慣れているから」などという
        理由ではなく、エディタとしてはEmacsの方が遙かに優れているからです。
        #Eclipseは統合環境である以上はエディタが貧弱なのは当たり前。

        より適切な道具を取捨選択して使った結果、今でもエディタにはEmacsを選択する。
        それだけのことです。

        >と言うことは、単純に考えても Eclipse 側には「若手が多い」というバイアスがかかります。
        あまりに単純化しすぎでは。

        上にも挙げたように、Emacsを使ってる人がEclipseも使っていることが多々あります。
        Eclipseから入った若手でも、(おそらくごく一部ではあるが、)Emacsを使ってる人もいます。
        #中にはずっとメモ帳でやってきて、最近になってやっとEclipseを覚えた
        #『経験豊富な熟練者』もいるかもしれないけど、一緒にやってくのには不安を覚える。

        Eclipseから入り、そしてそれ以外を知らない人の中には、自分では何も考えず、ツール
        が出す指示に従って切り張りする人がいます。それでエラーは出なくなるし、コンパイルも
        通ります。でもそれはプログラミングと呼ばれる作業とは全く異なるものでしょう。

        エディタは(たとえそれがEmacsであっても)何も指示してくれないので、自分で考えない人、
        考えられない人は最初の段階で躓きます。またそれを自分で自覚できます。何が分かって
        ないのかに気付くことが、学習への第一歩です。
        便利すぎる道具は、初心者が学習する時には逆効果になりかねません。
      • 1個のコメント が現在のしきい値以下です。
    • Anonymous Coward : 2008年05月21日 17時38分 (#1347775)
      実装工数5人日(神日?)なのにテスト工数を1人日しか取ってないのが全ての原因だと思われ。
    • Anonymous Coward : 2008年05月21日 18時05分 (#1347788)
      システムの肥大化は関係なしに、リソースが限られた状況下だからこそ、
      C/C++が採用される(活かされる)のだと思いますが。
      問題と思うなら何が問題で、言語にどのような仕様があれば解決するのか
      説明して頂けないでしょうか。
      #こういうことを尋ねると大概ライブラリの問題など言語に関係ない方向に進む。
    • 4個のコメント が現在のしきい値以下です。
  • Anonymous Coward : 2008年05月22日 0時11分 (#1347977)
    静的プログラム解析ツールというのは
    「ダメダメな人にでも使わせるとダメダメなプログラムがそれなりの出来になるツール」ではなくて、
    「それなりの人に使わせることでそれなりなプログラムがなかなか良い出来になるツール」なのでしょう。
    「すごい人に使わせてもすごいプログラムが完璧なできになるツール」でもないと思います。むしろこの場合は、ツールの出来によっては「見当はずれな警告しか出ないでストレスの元にしかならないツール」であるかもしれません。

    「こーんなヤツにこんなツールを使わせても役には立たないよ!」という話ばかりでなく、

    実際、次世代静的プログラム解析ツールを導入することで開発方法やテストサイクルに変化はあるのだろうか? 新しい解析ツールは既存のものよりそんなに実力が違うのだろうか?

    こちらの話も聞きたいのですが。「甲のツールを使っていたらこんな警告が出て、こんなバグを見つけたよー」とかいう話もよろしく。
    • Anonymous Coward : 2008年05月22日 2時53分 (#1348026)
      使っているツールの名前は出しませんがなかなか優秀だと感じました。
      ごくまれに、なんで警告が出るんだ出るわけないだろってこともあります。

      警告の内容は例えば
      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が意図していない内容になるかもしれないためだと思います。

      もっと深い警告もありますが今手元にデータが無いので内容覚えてません。
      かなりうろ覚えなため間違ってるかもしれません。
      そもそも「こんなコード書くなよ」といわれればそれまでですが。
    • 1個のコメント が現在のしきい値以下です。
  • Re:doxygen(古い? (スコア:2, おもしろおかしい)

    little( (31297) : 2008年05月21日 18時30分 (#1347803) ホームページ 日記
    私は何のツールも使わずに、1~4まですべて省略してますよ。
  • 5個のコメント が現在のしきい値以下です。