...

ソースコード 解析ツール

by user

on
Category: Documents
35

views

Report

Comments

Transcript

ソースコード 解析ツール
ソフトウェア品質向上セミナー
2015.07.17
ソースコード品質・レビュー品質
を改善するポイント
株式会社 富士通コンピュータテクノロジーズ
1328kc1
0
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
テストツール一覧
 アプリケーション開発における主な効率化ツール
機能テストツール
負荷生成ツール
規定した機能を果たすかどう
かを検証。単体試験の一部
カバレッジ測定ツール
負荷生成
ツール
機能テスト
ツール
システムの負荷を発生させ、ア
プリケーションの正常性・可用
性を検証
性能測定ツール
プログラムの制御構造を網羅
するホワイトボックステスト
技法を支援
ソフトウェアやハードウェ
アの応答性能を検証
カバレッジ
測定ツール
GUI操作自動化ツール
キーボードやマウス操作を記録
(キャプチャ)し、テストシナリ
オとして保存、このシナリオを再
生(リプレイ)し、テスト対象を
記録時と同じ動作させるツール (主
にリグレッションテストに使用)
テスト効率化
ツール
操作自動化
(キャプチャ&リプレイ)
ツール
性能測定
ツール
ソースコード
ソースコード
解析ツール
解析ツール
ソースコード解析ツール
特定の欠陥や欠陥につながる
可能性のあるソースコード上
の特徴を自動的に発見する
ツール
1/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
アジェンダ
ベンダー提供ツールによる
静的コード検証を超える価値のご提案
 静的解析ツール選択のポイント
 静的解析ツールを使用したレビュー効率向上のポイント
 ソースコード検証サービスのご紹介
2/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
ソフトウェア品質向上セミナー
2015.07.17
静的解析ツール選択のポイント




静的テストと動的テストの違い
静的解析ツールを使用するモチベーション
様々なタイプの静的解析ツール
静的解析ツールの選択スコープ
3/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的テストとは?
 静的テストとは、プログラムを動作させずにテストすること
 ドキュメント、ソースコード等をレビュー・インスペクションすること…
 静的解析ツールはレビュー・インスペクションを支援するツール
静的テスト
静的解析
ツール
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
pData = malloc(size);
if (pData == NULL) {
return -1;
}
ret = bar(*pData, *fName, size);
if (ret != 0) {
free(pData);
} else {
return -1;
コンパイル
プログラム・モジュール
動的テスト
4/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
工程別の欠陥混入・欠陥発見・修正コスト
 ソフトウェアの欠陥を未然に発見することで修正に関わるトータルコスト
を削減できる。( Shift Left)
$16,000
% Defects introduced
in this phase
% Defects found
in this phase
% Cost to repair defects
In this phase
$1,000
$250
$25
Coding
$100
Unit Test
Function Test
Field Test
Post Release
 Applied Software Measurement, Caper Jones
5/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的解析ツールとは
 静的解析ツールとはプログラムを実行せずに、プログラムを評価する
ツール全般を表す。(反対にプログラムを実行する場合は動的解析ツール)
 狭義な静的解析ツール
 ソースコード上の欠陥を検出するツール
• Coverity Qulaity Advisor、Klocwork Insight、Fortiry SCA、CodeSonar、(C++test)
• PGRlief、QAC/QAC++、LDRA、anyWarp CodeDirector
 広義な静的解析ツール
 ソフトウェアメトリクスやクローンコードを検出する静的解析ツール
• Understand、Lattix
 ランタイムエラー検出ツール
• DevPartner、Purify、Insure++
 上記はC/C++ソースコードを検証できる商用静的解析ツールの一部を抜粋したものです。
 各社の静的解析ツールの名称、社名等は各社の登録商標です。
6/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的解析ツールの仕組み(1)
 パターンマッチタイプの静的解析ツール
 ソースコードの記述方法に着目し、スタイルやコーディング規約に沿った厳格な
コーディングを実施する場合は、パターンマッチタイプの静的解析ツールが有効である。
PGRelief
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
QAC/QAC++
LDRA
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int bar(char *pData, char * fName, int size)
{
FILE *fp;
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;
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;
}
FIO18-C (CERT)
int foo(char *fName, int size)
{
fwrite() が書き込み操作を
char *pData;
int ret; null 文字で終了すると想
pData = malloc(size);
if (pData == NULL) {
return -1;
}
ret = bar(*pData, *fName, size);
if (ret != 0) {
free(pData);
} else {
return -1;
}
return 0;
FIO18-C
定しない
pData = malloc(size);
if (pData == NULL) {
return -1;
}
ret = bar(*pData, *fName, size);
パターンマッチタイプ
の静的解析ツールは、
if (ret !=関数の内容を評価せず
0) {
free(pData);
に一致した場合には指
} else {
return
-1;
摘とする場合が多い。
欠陥のパターンを多く持って
いるほど優秀な静的解析ツー
ルと言える。しかし指摘の件
数が増えるという欠点もある。
}
return 0;
}
7/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的解析ツールの仕組み(2)
 ビルドキャプチャータイプの静的解析ツール
 プログラムの動作に着目し、主に制御フロー・データフロー解析を実行するタイプの
静的解析ツールで、実際の欠陥を検出したい場合に有効である。
Coverity Quality Advisor
Klocwork Insight
Fortify SCA
CodeSonar
動的テスト
(ランタイムエラー検出)
静的解析ツール
ビルドキャプチャータイプの
静的解析ツールは、
動的テストと同じ動作が可能
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
pData = malloc(size);
if (pData == NULL) {
return -1;
}
ret = bar(*pData, *fName, size);
if (ret != 0) {
free(pData);
} else {
return -1;
エラー検出
return -1;
33:
コンパイル
ビルドキャプチャ
コンパイラ呼び出し
ランタイムライブラリに印加
24: pData =
中間表現
≒
プログラム・モジュール
解析(シミュレーション)
≒
テスト・デバック
malloc(size);
実機上でエミュレーション
8/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的解析ツールのスコープ
 それぞれのツールには、対象となるスコープがあるため、それを理解して
使用するツールを選択する必要がある。
PGRelief
スタイルを含め厳格なコーディングを実施する必要がある場合
Fortify SCA
ソースコード上のセキュリティ脆弱性を調査したい場合
Klocwork
一つのツールで全ての範囲(コーディング~インテグレーション)をカバーしたい場合
Coverity
ソースコード上の欠陥のみを検出し、誤検知・過検知を極力抑えたい場合
コーディング中心の
開発を行う場合
(パターンマッチタイプ)
大規模
1M~
中規模
100k~
流用やOSS等を多用する場合、
また集約型の開発を行う場合
(ビルドキャプチャータイプ)
Klocwork Insight
Coverity Quality Advisor
PGRelief
小規模
Fortify SCA
コーディング
静
故的
で
障解
は
の析
ビ
発ツ
ル
見ー
ド
にル
キ
重を
ャ
点使
プ
を用
チ
置し
ャ
いて
ー
てシ
タ
いス
イ
るテ
ムプ
のの
FCT
開発規模
(Steps)
インテグレーション
 上記は弊社の調査結果です。
 「過検知」はFCT独自に使用している用語です。
9/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
ソースコードの品質
 そもそも、何を検査(レビュー)したいか?
 JIS-X0129(ISO 9126)品質特性とソースコードの品質
品質特性
信頼性
保守性
移植性
効率性
機能性
品質副特性
ソースコードの品質(例)
C
C
成熟性
 ソースコードを使い込んだ時の欠陥の少なさ
障害許容性
 欠陥への対処(例外処理等が行われているか?)
解析性
 作ったソースコードは理解しやすいか?
変更性
 将来、ソースコードを改版しやすいつくりになっているか?
安定性
 ソースコードを改版する際に、プログラムへの影響が少ないつく
りになっているか?
試験性
 テストやデバックがしやすいか?
環境適応性
 他のOSやアーキテクチャ、またソフトウェアに移植しやすいソー
スコードになっているか?
時間効率性
 適切なアルゴリズムを使用しているか?
資源効率性
 無駄なスタックやヒープ領域を使用していないか?
セキュリ
ティ
 セキュアなコーディングがされているか?
 [出典]組み込みソフトウェア開発向け コーディング作法ガイド[C言語版]
• 「機能性-セキュリティ」を追加している。
10/ 24
P
P
P
P
P
P PGRelief
C
C Coverity
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的解析ツール選択のポイント
開発スタイル・開発規模に適した
静的解析ツールを選択しましょう!
 その他、静的解析ツールを選択する時の検討項目例
 静的解析ツールで検出したい事象
 遵守するべきコーディングルール
 ROI
11/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
ソフトウェア品質向上セミナー
2015.07.17
静的解析ツールを使用した
レビュー効率向上のポイント




ソースコードに含まれる欠陥の考え方
静的解析ツールで検出できるもの
静的解析ツールの能力
レビューの目標と分析
12/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
レビューの工数
 5MStep(5,000,000Step)のソースコードをレビューする。
 1人で1行/10秒間レビューすると?:
579日
 工数換算(8時間/1日、1月/20日):
86人月
 標準的なソースコード品質でCoverity Quality Advisorで解析をかけた場合
 10000件(おおよそ2件/Kstep程度)×5分 :
35日
 工数換算( 8時間/1日、1月/20日) :
5人月
まだまだ、現実的な工数には程遠い…
レビュー可能な件数に絞り込みたい
13/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
ソースコード上の欠陥について
ソースコード
ソースコードには
潜在化した欠陥も含まれている
欠陥が顕在化したものが故障となる
静的テスト
欠陥
静的解析ツールは
欠陥の可能性を検出
動的テスト
動的解析ツールは
故障を検出
欠陥
指摘
過検知
欠陥ではあるが
修正は必要ない
欠陥
欠陥
指摘
指摘
指摘
故障
開発者が期待する
静的解析ツールの指摘?
指摘
故障
誤検知
指摘
欠陥ではない
静的解析ツールの指摘
ISO/IEC 2383-14
実行時
JIS X 0014
定義
Failure
故障
要求された機能を遂行する機能単位の能力がなくなること
Fault
欠陥、障害
要求された機能を遂行する機能単位の能力の縮退、または喪失を引き
起こす異常な状態
Error
誤差・誤り
計算、観測若しくは測定された値または状態と、真の、指定された若
しくは論理的に正しい値または状態との間の相違
Detect
指摘、検知
静的解析ツールの検出した指摘
14/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
ソースコード上の欠陥含有率
 ソースコード上に含まれる欠陥含有率は、工程に応じて変化する。
レビュー・テストを実施する際、また静的解析ツールを適用する際の指標
が必要となる。(下記は成功プロジェクトの平均参考値)
Detect / KSteps
4.0
3.5
3.0
2.8
2.6
2.2
2.1
2.0
1.0
0.9
0.3
基本
機能
詳細
実装
単体
結合
統合
Schedule
15/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的解析ツールのポリシー
 各ツールベンダーによって、解析結果やレビューに関するポリシー
(考え方)が違うため、その特性を理解してツールを選択する必要がある。
検出数に違いがある
Positive
Negative
(検出する)
正検知
過検知?
(検出しない)
Positive
(検出する)
Negative
正検知
(検出しない)
過検知?
誤検知?
誤検知?
一般的な静的解析ツール
Coverity社静的解析ツール
一般的な静的解析ツール
Coverity社静的解析ツール
解析結果
欠陥を確実に検出できることに重
点を置く為、誤検知・過検知の可
能性があっても検出する
実際に発生する故障の検出に重点
を置き、誤検知・過検知はなるべ
く排除する
レビュー
見逃し(Ture Negative)は後工程
で開発者の負担となる
誤検知・過検知のレビューは開発
者の負担となる
 上記は弊社の調査結果です。
 「過検知」はFCT独自に使用している用語です。
16/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
静的解析ツールの実力
 レビューの品質予測には、静的解析ツールの実力を知ることが必要。
 検知(True Positive)を検出する能力(誤ったソースコードを検出する能力)
 誤検知(False Positive)を検出しない能力(正しいソースコードを検知しない能力)
正しいソースコード
間違ったソースコード
欠陥含有率
4,989kStep
11 kStep
陰性
True Negative
(検知不要)
False Negative
(未検知)
4985.51 kStep
5.07kStep
False Positive
(誤検知)
True Positive
(検知)
3.39 kStep
5.93 kStep
(Negative)
陽性
(Positive)
17/ 24
𝑁𝑒𝑔𝑎𝑡𝑖𝑣𝑒 + 𝑃𝑜𝑠𝑖𝑡𝑖𝑣𝑒
= 100%
静的解析ツール
ソースコード(結合工程)
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
正検知率、誤検知率の算出結果
 プロプライエタリなソースコード(5M Step)の例
100%
未検知
F.N.
(5569件?)
正検知率:53.90%
T.N.
誤検知 正検知
F.P.
T.P.
誤検知率:0.068%
6501件
3242件
99.78%
欠陥なし
0.22%
欠陥
100%
欠陥なし
欠陥あり
正しいソースコード
欠陥を含むソースコード
陰性(Negative)
99.932%
46.10%
陽性(Positive)
0.068%
53.90%
18/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
ベイズの定理応用例
 静的解析ツールを使用して解析結果が与えらとき、斜線面積の広さが、
欠陥の発生する確率を示している
80%
75%
71%
71%
59%
58%
50%
0.1023
(20%)
31%
UNINIT_CTOR
クラス内での未初期化
0.0568
(11%)
0.0767
(15%)
0.02 (4%)
0.0213(4%)
0.0174(3%)
0.024(5%)
0.1875
(36%)
33%
15%
0.0135
(3%)
25%
13%
STRING_OVERFLOW
オーバフロー
9%
RESOURCE_LEAK
リーク
OVERRUN
8%
FORWARD_NULL
BAD_SIZEOF
4% 3%... 1%
UNINIT
REVERSE_INULL
USER_AFTER_FREE解放後のアクセス DIVIDE_BY_ZEROゼロ除算
19/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
レビュー効率向上のポイント
静的解析ツールは、
過検知・誤検知があることを前提に
目標を設定してからレビュー実施しましょう!
 その他、レビュー効率向上の検討事項
 静的解析ツールの特色(ポリシー)
 静的解析ツールの検出能力
 レビューそのものの状況把握
20/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
ソフトウェア品質向上セミナー
2015.07.17
まとめ
 静的解析ツールの選択とレビューの効率化のポイント
 ソースコード検証サービス
21/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
まとめ
 ① 静的解析ツールの選択ポイント
開発スタイル・開発規模に適した
静的解析ツールを選択しましょう!
 ② 静的解析ツールを使用したレビュー効率向上のポイント
静的解析ツールは、
過検知・誤検知があることを前提に
目標を設定してからレビュー実施しましょう!
22/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
サービスメニュー概要
 ソースコード品質・レビュー品質を改善するサービスメニュー
コーディング規約
規約作成支援
レビュー支援
未検知分析
P
コード修正
A
コーディング
D
C
レビュー
静的解析
解析結果
弊社のサービス
傾向分析・詳細分析
お客様のプロセス・資産
サービス概要
静的解析
最先端の静的解析ツールを活用し、通常の人的レビューでは発見できないコード上の潜在欠陥を検
出します(トライアル解析を無償で実施します)
傾向分析
静的解析ツールの弱点である膨大な指摘の中から、開発の状況に合わせて正しい指摘(誤検知・過
検知の排除)とレビューの優先順位を、弊社の分析技術を用いて抽出します
詳細分析
弊社のエンジニアが、静的解析の指摘を一件毎にレビューし、欠陥のメカニズム・影響度・修正候
補等を提示します
未検知分析
複雑な構造の重大欠陥等、汎用の静的解析ツールでは検出できない欠陥を、静的解析ツールの機能
やOSSをベースとしたツール等を活用して同一パターンを検出し、欠陥見逃しを防ぎます
レビュー支援
静的解析の結果やレビュー後の修正状況を管理し、第三者のチェックを行うことで、重大欠陥の修
正漏れや見逃しを防止します
規約作成支援
静的解析ツールの分析結果やレビュー支援状況から、お客様の開発の効果のあるコーディング規約
作成を支援します(特に「信頼性」や「セキュリティ」の観点)
23/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
商標について
 CoverityおよびCoverityロゴ、Coverity Static Analysis、Coverity Extend、Coverity Prevent、 Coverity
Auditは、米国およびその他の国における Coverity, Inc.の 商標または登録商標です。
 Klocwork Insightは、Klocwork社の商標または登録商標です。
 Fortify SCAはFortify、HPの商標または登録商標です。
 CodeSonarはGammaTech社の商標または登録商標です。
 Windows、およびVisual Studioは、 米国およびその他の国におけるMicrosoft Corp.の商標または登録商標
です。
 Linuxは、Linus Torvalds氏の米国およびその他の国における登録商標あるいは商標です。
 Sun / Solaris / Javaに関連するすべての商標および ロゴマークは、米国 Oracle, Inc.の米国およびそ
の他の国における商標または 登録商標です。
 Eclipseは、開発ツールプロバイダーのオープンコミュニティーであるEclipse Foundation, Inc. により構築
された開発ツール統合のためのオープンプラットフォームです。
 MISRAとそのロゴは、MISRAコンソーシアムを代表してMISRA Ltd.の登録商標です。
 その他の会社名、商品名は各社の商標、または登録商標です。
24/ 24
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED
Fly UP