組込みシステム開発技術展 (ESEC) 2014 年 5 月 14 日 ~16 日 静的解析ツールの効果的活用方法 株式会社富士通コンピュータテクノロジーズ TMP 事業部検証ソリューション部土屋 (14 15 日 ) 馬渕 (16 日 ) 1275kc1
会社概要 株式会社富士通コンピュータテクノロジーズ 設立 1983 年 事業所川崎本社 豊橋事業所 長野事業所 事業内容 サーバ ストレージ モバイル端末 車載 /FA 機器 画像認識 ハードウェア ネットワーク 検証ソリューション 従業員数 536 名 組込みソフトウェア開発 組込みハードウェア開発 組込みプラットフォーム テストフ ロク ラム開発 / 検証評価 300 名 50 名 35 名 100 名 1 Copyright 2014 FUJITSU COMPUTER TECHNOLOGIES LIMITED
始めに コーディングテスト用のツールは使われていますか? 組込み開発におけるコーディングテストツール 50% 使用率 40% 30% 20% 10% 0% モデルベース テストツール レビュー支援ツール静的解析ツール動的解析ツール 本日の話題 各社静的解析ツールの特徴 開発スタイルに合わせた静的解析ツールの選択の方法 1/ 14
実装工程における静的テストとは? 静的テストとはプログラムを実行せずに実施するテストです ソースコード品質を確保するためには レビュー インスペクション等の実施が重要です チェックリスト等を使用し レビュー観点を明確にします 仕様に基づいているか検証します コーディング規約に基づいているか検証します 静的解析ツールを使用することでレビューの品質 生産性が向上します ( 入力資料 ) 仕様書 ( 入力資料 ) チェックリスト ( コーディングの生産物 ) ( レビューの入力資料 ) ソースコード ( レビューの生産物 ) レビュー記録 コーディング 静的解析ツール レビュー インスペクション ( 入力資料 ) コーディング規約 2/ 14
静的解析ツールとは?(1) プログラムを実行せずにソースコード上の欠陥を検出することが出来ます コーディング段階から使用できるためフロントローディングに寄与します 01: #include <stdio.h> 02: #include <stdlib.h> 03: #include <memory.h> 04: 05: int bar(char *pdata, char * fname, int size) 06: { 07: FILE *fp; 08: 09: fp = fopen(fname, wb ); 10: if (fp == NULL) { 11: return -1; 12: 13: memset(pdata, 0x20, size); 14: fwrite(pdata, size,1, fp); 15: fclose(fp); 16: return 0; 17: 18: 19: int foo(char *fname, int size) 20: { 21: char *pdata; 22: int ret; 23: 24: pdata = malloc(size); 25: if (pdata == NULL) { 26: return -1; 27: 28: ret = bar(*pdata, *fname, size); 29: 30: if (ret!= 0) { 31: free(pdata); 32: else { 33: return -1; 34: 35: return 0; 36: レビュー インスペクション 静的解析ツール #include <stdio.h> #include <stdlib.h> #include <memory.h> int bar(char *pdata, char * fname, int size) { FILE *fp; fp = fopen(fname, wb ); if (fp == NULL) { return -1; memset(pdata, 0x20, size); fwrite(pdata, size,1, fp); fclose(fp); return 0; int foo(char *fname, int size) { char *pdata; int ret; pdata = malloc(size); if (pdata == NULL) { return -1; ret = bar(*pdata, *fname, size); if (ret!= 0) { free(pdata); else { return -1; return 0; Memory Leak 領域獲得 未解放 4/ 14
静的解析ツールとは?(2) 静的解析ツールとはプログラムを実行せずにプログラムを評価するツール全般を表します ( プログラムを実行する : 動的解析ツール ) 狭義な静的解析ツール ソースコード上の欠陥を検出するツール Coverity Qulaity Advisor Klocwork Insight Fortiry SCA CodeSonar (C++test) PGRlief QAC/QAC++ LDRA anywarp CodeDirector 広義な静的解析ツール ソフトウェアメトリクスやクローンコードを検出する静的解析ツール Understand Lattix ランタイムエラー検出ツール DevPartner Purify Insure++ 上記は C/C++ ソースコードを検証できる商用静的解析ツールの一部を抜粋したものです 各社の静的解析ツールの名称 社名等は各社の登録商標です 3/ 14
静的解析ツールの仕組み (1) パターンマッチタイプの静的解析ツール 従来から多いタイプの静的解析ツールです (lint タイプという言い方をする場合があります ) PGReliefは様々なコーディング規約等に対応していてるため 多くの欠陥を検出できます Memory Leak 01: #include <stdio.h> 02: #include <stdlib.h> 03: #include <memory.h> 04: 05: int bar(char *pdata, char * fname, int size) 06: { 07: FILE *fp; 08: 09: fp = fopen(fname, wb ); 10: if (fp == NULL) { 11: return -1; 12: 13: memset(pdata, 0x20, size); 14: fwrite(pdata, size,1, fp); 15: fclose(fp); 16: return 0; 17: 18: 19: int foo(char *fname, int size) 20: { 21: char *pdata; 22: int ret; 23: 24: pdata = malloc(size); 25: if (pdata == NULL) { 26: return -1; 27: 28: ret = bar(*pdata, *fname, size); 29: 30: if (ret!= 0) { 31: free(pdata); 32: else { 33: return -1; 34: 35: return 0; 36: 欠陥のパターンフィルター #include <stdio.h> #include <stdlib.h> #include <memory.h> int bar(char *pdata, char * fname, int size) { FILE *fp; fp = fopen(fname, wb ); if (fp == NULL) { return -1; memset(pdata, 0x20, size); fwrite(pdata, size,1, fp); fclose(fp); return 0; int foo(char *fname, int size) { char *pdata; int ret; pdata = malloc(size); if (pdata == NULL) { return -1; ret = bar(*pdata, *fname, size); if (ret!= 0) { free(pdata); else { return -1; return 0; 領域獲得 未解放 5/ 14
静的解析ツールの仕組み (2) ビルドキャプチャー型静的解析ツール 制御フロー データフローを解析するタイプの静的解析ツールです 形式手法を応用した解析を実施するタイプの静的解析ツールもあります 動的解析ツール ( ランタイムエラー検出ツール ) が使用できないプラットフォームの場合は有効です ソースコード ビルドキャプチャ型 コンパイラ呼び出し ランタイムライブラリに印加 ビルド キャプチャ コンパイル 中間表現 プログラム モジュール 実機上でエミュレーション 解析 ( シミュレーション ) デバック テスト 静的解析ツール 6/ 14 動的解析ツール
開発スタイルと静的解析ツールの選択 ソフトウェア開発におけるコーディングの実施比率の違い 始めから開発をする ( コーディングをする ) 過去の開発した実績あるソースコードや オープンソースを活用することで開発コストの削減や効率向上を図る場合があります ( あまりコーディングをしない ) 契約 仕様 受入検査 ( ユーザ企業 ) 開発 ( ベンダー企業 ) コーディング 納品物 ソースコードに欠陥 ( バグ ) が無いことを確認したい ビルドキャプチャー型 コーディング時には可読性や保守性を含めて品質を向上させたい パターンマッチ型 流用 OSS 静的解析ツール インテグレーション 7/ 14
静的解析ツールのスコープ PGRelief Klocwork Insight Coverity Quality Advisor を比較した場合 PGRelief を使用すると厳格なコーディングを実施することが出来きます Coverity Quality Advisor はソースコード上に含まれる欠陥 ( バグ ) の検出に注力しています Klocwork Insight はすべての範囲をカバーするように作られています 開発規模 大規模 1M~ Coverity Quality Advisor 中規模 100k~ Klocwork Insight 小規模 PGRelief コーディング インテグレーション コーディング インテグレーション 上記は C/C++ ソースコードを検証できる商用静的解析ツールの一部です 各社の静的解析ツールの社名 名称等は各社の登録商標です 8/ 14
静的解析ツールのポリシー 検出数に違いがある Positive ( 検出する ) 正検知 Negative ( 検出しない ) Positive ( 検出する ) 正検知 Negative ( 検出しない ) 過検知? 誤検知? 過検知? 誤検知? Klocwork 社静的解析ツール Klocwork 社静的解析ツール Coverity 社静的解析ツール Coverity 社静的解析ツール 欠陥に対する考え方開発に対する考え方解析結果効果 欠陥を確実に検出できること 未検知 ( 見逃し ) が無いことに重点を置いている 未検知 ( 見逃し ) は後工程で結果的に開発者にとって負担が増える 解析結果に誤検知 過検知の可能性があっても含める傾向にある 新規開発 ミッションクリティカル分野に効果的 修正が必要な欠陥だけを検出できること 誤検知 過検知を防ぐことに重点を置いている 誤検知 過検知をレビューすることは開発者の負担が増える 解析結果は誤検知 過検知の可能性があれば排除する傾向にある 流用開発 大規模開発に効果的 注 ) 正検知 未検知 過検知は弊社で便宜上使用している用語です 9/ 14
ソースコード検証サービス 富士通コンピュータテクノロジーズの ソースコード検証サービス では適切な静的解析ツールの選択 ~ 運用まで実装工程の支援を実施します コーディング規約 規約作成支援 コード修正 P コーディング レビュー支援 A D 静的解析 未検知分析 レビュー C 解析結果 静的解析傾向分析詳細分析未検知分析レビュー支援規約作成支援 サービス概要 傾向分析 詳細分析 最先端の静的解析ツールを活用し 通常の人的レビューでは発見できないコード上の潜在欠陥を検出します ( トライアル解析を無償で実施します ) 静的解析ツールの弱点である膨大な指摘の中から 開発の状況に合わせて正しい指摘 ( 誤検知 過検知の排除 ) とレビューの優先順位を 弊社の分析技術を用いて抽出します 弊社のエンジニアが 静的解析の指摘を一件毎にレビューし 欠陥のメカニズム 影響度 修正候補等を提示します 複雑な構造の重大欠陥等 汎用の静的解析ツールでは検出できない欠陥を 静的解析ツールの機能や OSS をベースとしたツール等を活用して同一パターンを検出し 欠陥見逃しを防ぎます 静的解析の結果やレビュー後の修正状況を管理し 第三者のチェックを行うことで 重大欠陥の修正漏れや見逃しを防止します 静的解析ツールの分析結果やレビュー支援状況から お客様の開発の効果のあるコーディング規約作成を支援します ( 特に 信頼性 や セキュリティ の観点 ) 弊社で提供するサービス お客様のプロセス 資産 10/ 14
まとめ 静的解析ツールでも違いはあります スコープ ポリシーに違いがあります 開発スタイルに合った静的解析ツールを選びましょう ソースコード検証サービスでは 静的解析ツールの選択 ~ 運用 ~ 実装工程の PDCA 改善をお手伝いします ご清聴ありがとうございました 11/ 14
12/ 14
ソースコードの品質 そもそも 何を検査したいか? JIS-X0129(ISO 9126) 品質特性とソースコードの品質 品質特性品質副特性ソースコードの品質 ( 例 ) 信頼性 保守性 移植性 効率性 成熟性 ソースコードを使い込んだ時の欠陥の少なさ 障害許容性 欠陥への対処 ( 例外処理等が行われているか?) 解析性 作ったソースコードは理解しやすいか? 変更性 将来 ソースコードを改版しやすいつくりになっているか? 安定性 ソースコードを改版する際に プログラムへの影響が少ないつくりになっているか? 試験性 テストやデバックがしやすいか? 環境適応性 他の OS やアーキテクチャ またソフトウェアに移植しやすいソースコードになっているか? 時間効率性 適切なアルゴリズムを使用しているか? 資源効率性 無駄なスタックやヒープ領域を使用していないか? 機能性セキュリティ セキュアなコーディングがされているか? [ 出典 ] 組み込みソフトウェア開発向けコーディング作法ガイド [C 言語版 ] 機能性 - セキュリティ を追加している 13/ 14
ソースコード上の欠陥について ソースコードには潜在化した欠陥も含まれている ソースコード 欠陥が顕在化したものが故障となる 静的テスト 欠陥 欠陥 動的テスト 静的解析ツールは欠陥の可能性を検出 指摘 欠陥 欠陥 動的解析ツールは故障を検出 指摘 指摘 故障 指摘 指摘 開発者が期待する静的解析ツールの指摘? 故障 指摘 静的解析ツールの指摘 実行時 ISO/IEC 2383-14 JIS X 0014 定義 Failure 故障要求された機能を遂行する機能単位の能力がなくなること Fault Error 欠陥 障害 誤差 誤り 要求された機能を遂行する機能単位の能力の縮退 または喪失を引き起こす異常な状態 計算 観測若しくは測定された値または状態と 真の 指定された若しくは論理的に正しい値または状態との間の相違 Detect 指摘 検知静的解析ツールの検出した指摘 14/ 14 Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED