ESEC 2014 5 14 16 - Fujitsu...2014/01/17  ·...

16
株式会社 富士通コンピュータテクノロジーズ TMP事業部検証ソリューション部 土屋(1415日)、馬渕(16日) 静的解析ツールの効果的活用方法 組込みシステム開発技術展(ESEC) 2014年5月14日~16日 Copyright 2014 Fujitsu Computer Technologies Limited 1275kc1

Transcript of ESEC 2014 5 14 16 - Fujitsu...2014/01/17  ·...

株式会社 富士通コンピュータテクノロジーズ TMP事業部検証ソリューション部 土屋(14、15日)、馬渕(16日)

静的解析ツールの効果的活用方法

組込みシステム開発技術展(ESEC) 2014年5月14日~16日

Copyright 2014 Fujitsu Computer Technologies Limited

1275kc1

会社概要

株式会社 富士通コンピュータテクノロジーズ

設立 1983年

事業所 川崎本社、豊橋事業所、長野事業所

事業内容

サーバ、ストレージ

モバイル端末、車載/FA機器、画像認識

ハードウェア、ネットワーク、検証ソリューション

従業員数 536名

組込みソフトウェア開発 300名

組込みハードウェア開発 50名

組込みプラットフォーム 35名

テストプログラム開発/検証評価 100名

Copyright 2014 FUJITSU COMPUTER TECHNOLOGIES LIMITED 1

始めに

コーディングテスト用のツールは使われていますか?

本日の話題

Copyright 2014 Fujitsu Computer Technologies Limited

0%

10%

20%

30%

40%

50%

モデルベース

テストツール

レビュー支援ツール 静的解析ツール 動的解析ツール

組込み開発におけるコーディングテストツール 使用率

各社静的解析ツールの特徴

開発スタイルに合わせた静的解析ツールの選択の方法

1/ 14

実装工程における静的テストとは?

静的テストとはプログラムを実行せずに実施するテストです。

ソースコード品質を確保するためには、レビュー・インスペクション等の実施が重要です。 チェックリスト等を使用し、レビュー観点を明確にします。

仕様に基づいているか検証します。

コーディング規約に基づいているか検証します。

静的解析ツールを使用することでレビューの品質、生産性が向上します。

Copyright 2014 Fujitsu Computer Technologies Limited

(入力資料)

コーディング 規約

(コーディングの生産物) (レビューの入力資料)

ソースコード

(入力資料)

チェックリスト

(レビューの生産物)

レビュー記録

コーディング レビュー・インスペクション

(入力資料)

仕様書

静的解析ツール

2/ 14

静的解析ツールとは?(1)

プログラムを実行せずにソースコード上の欠陥を検出することが出来ます。

コーディング段階から使用できるためフロントローディングに寄与します。

Copyright 2014 Fujitsu Computer Technologies Limited

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: }

静的解析 ツール

レビュー・インスペクション

4/ 14

#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

静的解析ツールとは?(2)

Copyright 2014 Fujitsu Computer Technologies Limited

上記はC/C++ソースコードを検証できる商用静的解析ツールの一部を抜粋したものです。 各社の静的解析ツールの名称、社名等は各社の登録商標です。

静的解析ツールとはプログラムを実行せずにプログラムを評価するツール全般を表します。(プログラムを実行する:動的解析ツール)

狭義な静的解析ツール ソースコード上の欠陥を検出するツール

• Coverity Qulaity Advisor、Klocwork Insight、Fortiry SCA、CodeSonar、、(C++test)

• PGRlief、QAC/QAC++、LDRA、anyWarp CodeDirector

広義な静的解析ツール ソフトウェアメトリクスやクローンコードを検出する静的解析ツール

• Understand、Lattix

ランタイムエラー検出ツール

• DevPartner、Purify、Insure++

3/ 14

静的解析ツールの仕組み(1)

パターンマッチタイプの静的解析ツール 従来から多いタイプの静的解析ツールです。(lintタイプという言い方をする場合がありま

す。)

PGReliefは様々なコーディング規約等に対応していてるため、多くの欠陥を検出できます。

Copyright 2014 Fujitsu Computer Technologies Limited

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

5/ 14

静的解析ツールの仕組み(2)

ビルドキャプチャー型静的解析ツール 制御フロー、データフローを解析するタイプの静的解析ツールです。

形式手法を応用した解析を実施するタイプの静的解析ツールもあります。

動的解析ツール(ランタイムエラー検出ツール)が使用できないプラットフォームの場合は有効です。

Copyright 2014 Fujitsu Computer Technologies Limited

ビルドキャプチャ型

ソースコード

コンパイル

プログラム・モジュール

ビルド・キャプチャ

中間表現

解析 (シミュレーション)

デバック・テスト

コンパイラ呼び出し

実機上でエミュレーション

静的解析ツール 動的解析ツール

ランタイムライブラリに印加

6/ 14

開発スタイルと静的解析ツールの選択

ソフトウェア開発におけるコーディングの実施比率の違い 始めから開発をする。(コーディングをする)

過去の開発した実績あるソースコードや、オープンソースを活用することで開発コストの削減や効率向上を図る場合があります。(あまりコーディングをしない)

Copyright 2014 Fujitsu Computer Technologies Limited

仕様

静的解析ツール

開発 (ベンダー企業) 納品物

受入検査 (ユーザ企業)

契約

流用・OSS インテグレーション

コーディング

コーディング時には 可読性や保守性を

含めて品質を向上させたい

パターンマッチ型

ソースコードに 欠陥(バグ)が無いこと

を確認したい

ビルドキャプチャー型

7/ 14

静的解析ツールのスコープ

PGRelief、Klocwork Insight、Coverity Quality Advisorを比較した場合 PGReliefを使用すると厳格なコーディングを実施することが出来きます。

Coverity Quality Advisorはソースコード上に含まれる欠陥(バグ)の検出に注力しています。

Klocwork Insightはすべての範囲をカバーするように作られています。

Copyright 2014 Fujitsu Computer Technologies Limited

開発規模

小規模

中規模 100k~

大規模 1M~

PGRelief

Klocwork Insight

Coverity Quality Advisor

コーディング インテグレーション

コーディング インテグレーション 上記はC/C++ソースコードを検証できる商用静的解析ツールの一部です。 各社の静的解析ツールの社名、名称等は各社の登録商標です。

8/ 14

静的解析ツールのポリシー

Copyright 2014 Fujitsu Computer Technologies Limited

Klocwork社静的解析ツール Coverity社静的解析ツール

欠陥に対する考え方 欠陥を確実に検出できること・未検知(見逃し)が無いことに重点を置いている

修正が必要な欠陥だけを検出できること、誤検知・過検知を防ぐことに重点を置いている

開発に対する考え方 未検知(見逃し)は後工程で結果的に開発者にとって負担が増える

誤検知・過検知をレビューすることは開発者の負担が増える

解析結果 解析結果に誤検知・過検知の可能性があっても含める傾向にある

解析結果は誤検知・過検知の可能性があれば排除する傾向にある。

効果 新規開発、ミッションクリティカル分野に効果的

流用開発・大規模開発に効果的

Positive (検出する)

Negative (検出しない)

過検知? 誤検知?

正検知 Positive (検出する)

Negative (検出しない)

過検知? 誤検知?

正検知

Klocwork社静的解析ツール Coverity社静的解析ツール

検出数に違いがある

注)正検知、未検知、過検知は弊社で便宜上使用している用語です。

9/ 14

ソースコード検証サービス

富士通コンピュータテクノロジーズの「ソースコード検証サービス」では適切な静的解析ツールの選択~運用まで実装工程の支援を実施します。

Copyright 2014 Fujitsu Computer Technologies Limited

P

D

C

A

コーディング規約

静的解析

傾向分析・詳細分析

コーディング

解析結果

規約作成支援

レビュー 未検知分析

レビュー支援

コード修正

弊社で提供するサービス

お客様のプロセス・資産

サービス概要

静的解析 最先端の静的解析ツールを活用し、通常の人的レビューでは発見できないコード上の潜在欠陥を検出します(トライアル解析を無償で実施します)

傾向分析 静的解析ツールの弱点である膨大な指摘の中から、開発の状況に合わせて正しい指摘(誤検知・過検知の排除)とレビューの優先順位を、弊社の分析技術を用いて抽出します

詳細分析 弊社のエンジニアが、静的解析の指摘を一件毎にレビューし、欠陥のメカニズム・影響度・修正候補等を提示します

未検知分析 複雑な構造の重大欠陥等、汎用の静的解析ツールでは検出できない欠陥を、静的解析ツールの機能やOSSをベースとしたツール等を活用して同一パターンを検出し、欠陥見逃しを防ぎます

レビュー支援 静的解析の結果やレビュー後の修正状況を管理し、第三者のチェックを行うことで、重大欠陥の修正漏れや見逃しを防止します

規約作成支援 静的解析ツールの分析結果やレビュー支援状況から、お客様の開発の効果のあるコーディング規約作成を支援します(特に「信頼性」や「セキュリティ」の観点)

10/ 14

まとめ

静的解析ツールでも違いはあります。 スコープ、ポリシーに違いがあります。

開発スタイルに合った静的解析ツールを選びましょう。

ソースコード検証サービスでは、静的解析ツールの選択~運用~実装工程のPDCA改善をお手伝いします。

Copyright 2014 Fujitsu Computer Technologies Limited

ご清聴ありがとうございました。

11/ 14

Copyright 2014 Fujitsu Computer Technologies Limited 12/ 14

ソースコードの品質

そもそも、何を検査したいか?

JIS-X0129(ISO 9126)品質特性とソースコードの品質

[出典]組み込みソフトウェア開発向け コーディング作法ガイド[C言語版]

「機能性-セキュリティ」を追加している。

Copyright 2014 Fujitsu Computer Technologies Limited

品質特性 品質副特性 ソースコードの品質(例)

信頼性 成熟性 ソースコードを使い込んだ時の欠陥の少なさ

障害許容性 欠陥への対処(例外処理等が行われているか?)

保守性

解析性 作ったソースコードは理解しやすいか?

変更性 将来、ソースコードを改版しやすいつくりになっているか?

安定性 ソースコードを改版する際に、プログラムへの影響が少ないつく

りになっているか?

試験性 テストやデバックがしやすいか?

移植性 環境適応性 他のOSやアーキテクチャ、またソフトウェアに移植しやすいソー

スコードになっているか?

効率性 時間効率性 適切なアルゴリズムを使用しているか?

資源効率性 無駄なスタックやヒープ領域を使用していないか?

機能性 セキュリティ セキュアなコーディングがされているか?

13/ 14

ソースコード上の欠陥について

ISO/IEC 2383-14 JIS X 0014 定義

Failure 故障 要求された機能を遂行する機能単位の能力がなくなること

Fault 欠陥、障害 要求された機能を遂行する機能単位の能力の縮退、または喪失を引き起こす異常な状態

Error 誤差・誤り 計算、観測若しくは測定された値または状態と、真の、指定された若しくは論理的に正しい値または状態との間の相違

Detect 指摘、検知 静的解析ツールの検出した指摘

Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED

ソースコード

実行時

欠陥

欠陥

欠陥

欠陥

故障

故障 指摘

指摘

指摘

指摘

指摘

指摘

静的解析ツールの指摘

開発者が期待する 静的解析ツールの指摘?

動的テスト 静的テスト

ソースコードには 潜在化した欠陥も含まれている 欠陥が顕在化したものが故障となる

静的解析ツールは 欠陥の可能性を検出

動的解析ツールは 故障を検出

14/ 14