Upgrade to Pro — share decks privately, control downloads, hide ads and more …

それなりの規模のソフト開発における静的コード解析活用プラクティス

 それなりの規模のソフト開発における静的コード解析活用プラクティス

静的コード解析(スタイルチェック…特にバグの警告)について有効に使うためのプラクティスであまり語られていないところをまとめました。
#Static Code Analysis, Style Checker, 静的解析

masskaneko

May 28, 2014
Tweet

Other Decks in Programming

Transcript

  1. お話のスコープ • それなりの大きさの開発向け • 10人以上, 20万行以上, ライフ5年以上...だとか • C/C++, Java

    • スタイルチェック(特にバグの警告)について 有効に使うためのプラクティスであんまり 語られていないところ。 • ツールの例は話しますが、特定のツールの話はしません。 • 構造解析や形式手法の話はありません • セキュアプログラミングの話はありません
  2. ツール例 • 無償 • [C/C++] Cppcheck, CPAchecker • [Java] FindBugs,

    PMD • 商用 • Coverity Static Analysis • Grammatech CodeSonar • Mathworks PolySpace
  3. 警告は沢山出てくる 対象 言語 行数 警告数 警告数/1000行 MongoDB 2.6 C++ 551508

    1285 2.3 Apache 2.4.9 C 95877 731 7.6 Maven 3.2.1 Java 42753 858 20.0 Cppcheck : 1.65 FindBugs : 2.0.3 SourceMonitor : 3.4.6.297 (行数の測定に使用. 正確には文の数) 適当にメジャーなOSSを3つピックアップした Cppcheck : 1.65 FindBugs : 2.0.3 SourceMonitor : 3.4.6.297 (行数の測定に使用. 正確には文の数)
  4. 警告は沢山出てくる 対象 言語 行数 警告数 警告数/1000行 Telecom EMS/NMS system C++

    6M LOC 400k 66.6 Financial Web App Java JS 1M LOC 20k 20.0 全ての警告をレビューすることは非効率。 (注)先に示したOSSの例との単純比較はできない。行の数え方が異なる。 使用した静的コード解析ツールが同じとは限らない。 米Intuit社エンジニア John Ruberto 氏の発表(*2)によると
  5. バグが起きそうな箇所に絞る(他の案) • 複雑さを表すコードメトリクスを利用する • サイクロマティック複雑度とかLCOMとか • 複雑なコードほどバグが起きやすい • 警告数と複雑さ…因果は無いだろうけど相関はあるのでは? •

    bugspots のスコアを利用する • リポジトリを食わせるとフォルダとファイル別にバグの起きやす さを示すスコアが出てくる。 • スコア計算式の変数は変更回数だけなので静的コード解析で見つ かるバグではないのでは。一工夫すれば使えるかも? (注)筆者自信なし
  6. func( MyTable* p ) { if( (p->data == INVALID )

    || (p == NULL) ) return; ... } 10秒でわかる例
  7. func(*a, *b) { *p; *q; … p = foo(a->x, b->y);

    … q = baa(a->w, b->w); … … … … r = heck(p,q); … r->data = …; Warning: Null Pointer Dereference えーとまず r は p, q から求まって その p, q は…あーこれか heck() には return NULL; 無いから 絶対有効なアドレスが 入るはずなんだけどなー あれ?でも a, b って元はファイルから 読んでくるんだったよな… とりあえず foo, baa, heck 全部読むか うわッ!長ッ…! 面倒だから全部NULLチェックするか… ってもしそれで抜けちゃったら そのあとはどうすれば… 悩むことも
  8. 警告に関する修正優先度の例 修正 優先度 説明 修正方針 最高 警告された内容がユーザーの使用環境で 発生し、ユーザーに不利益をもたらす。 絶対に直す。 高

    警告された内容はユーザーの使用環境で 発生するものの、ユーザーに不利益はも たらさない。 これも絶対に直したいが、やむを得 ない事情があれば見送る場合も。 中 ・警告された内容はユーザーの使用環境 では発生しないが、開発者環境では発生 させることができる。 ・バグではないが、バグを誘発しやすい スタイル。 将来のバグの素なので、 これらをいかに潰すかが肝。 無 ツールの誤検出。 本当に誤検出なのか、よく考える。 「ユーザー環境で発生しないから 誤検出だ」などと考えないこと。
  9. 修正判断に自信が無い場合 • ユニットテストを書いてみよう • 自信が無いのは警告対象コードを理解してないから • ユニットテストを書けば理解が進む (*3) • バグが起こるという警告であれば、そのバグを起こそ

    うという姿勢でテストを書く • 他の人にレビューしてもらおう • 一人では見逃すバグがすぐ発見できるかも • チームでコードを共有する機会ができる • 相手に話しているうちに理解が進む
  10. References • *1:【CEDEC 2012】静的コード解析ツールがバグを潰し、新 人を育てる http://www.inside-games.jp/article/2012/08/31/59369.html • *2: Introducing Static

    Analysis in a Mature Codebase http://www.slideshare.net/JohnRuberto/introducing-static-analysis-john-ruberto-jan-2014 • *3: レガシーコード改善ガイド 2009, 翔泳社 http://books.shoeisha.co.jp/book/b73170.html •