26
Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED ソースコード品質・レビュー品質 を改善するポイント 株式会社 富士通コンピュータテクノロジーズ 0 ソフトウェア品質向上セミナー 2015.07.17 1328kc1

ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

ソースコード品質・レビュー品質 を改善するポイント

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

0

ソフトウェア品質向上セミナー 2015.07.17

1328kc1

Page 2: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

アプリケーション開発における主な効率化ツール

テストツール一覧

カバレッジ 測定ツール

機能テスト ツール

負荷生成 ツール

ソースコード 解析ツール

操作自動化 (キャプチャ&リプレイ)

ツール

性能測定 ツール

テスト効率化 ツール

負荷生成ツール

システムの負荷を発生させ、アプリケーションの正常性・可用性を検証

性能測定ツール

ソフトウェアやハードウェアの応答性能を検証

機能テストツール

規定した機能を果たすかどうかを検証。単体試験の一部

カバレッジ測定ツール

プログラムの制御構造を網羅するホワイトボックステスト技法を支援

ソースコード解析ツール

特定の欠陥や欠陥につながる可能性のあるソースコード上の特徴を自動的に発見するツール

GUI操作自動化ツール

キーボードやマウス操作を記録(キャプチャ)し、テストシナリオとして保存、このシナリオを再生(リプレイ)し、テスト対象を記録時と同じ動作させるツール (主にリグレッションテストに使用)

ソースコード 解析ツール

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED 1/ 24

Page 3: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

アジェンダ

静的解析ツール選択のポイント

静的解析ツールを使用したレビュー効率向上のポイント

ソースコード検証サービスのご紹介

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

ベンダー提供ツールによる 静的コード検証を超える価値のご提案

2/ 24

Page 4: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

静的テストと動的テストの違い

静的解析ツールを使用するモチベーション

様々なタイプの静的解析ツール

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

静的解析ツール選択のポイント

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

ソフトウェア品質向上セミナー 2015.07.17

3/ 24

Page 5: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

静的テストとは?

静的テストとは、プログラムを動作させずにテストすること ドキュメント、ソースコード等をレビュー・インスペクションすること…

静的解析ツールはレビュー・インスペクションを支援するツール

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

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;

プログラム・モジュール

コンパイル

静的テスト

動的テスト

静的解析 ツール

4/ 24

Page 6: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

工程別の欠陥混入・欠陥発見・修正コスト

ソフトウェアの欠陥を未然に発見することで修正に関わるトータルコストを削減できる。( Shift Left)

Applied Software Measurement, Caper Jones

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

Coding Unit Test Function Test Field Test Post Release

$25 $100

$250

$1,000

$16,000 % Defects introduced in this phase

% Defects found in this phase

% Cost to repair defects In this phase

5/ 24

Page 7: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

静的解析ツールとは

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

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

静的解析ツールとはプログラムを実行せずに、プログラムを評価する ツール全般を表す。(反対にプログラムを実行する場合は動的解析ツール)

狭義な静的解析ツール

ソースコード上の欠陥を検出するツール

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

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

広義な静的解析ツール

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

• Understand、Lattix

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

• DevPartner、Purify、Insure++

6/ 24

Page 8: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

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

パターンマッチタイプの静的解析ツール ソースコードの記述方法に着目し、スタイルやコーディング規約に沿った厳格な

コーディングを実施する場合は、パターンマッチタイプの静的解析ツールが有効である。

Copyright 2015 FUJITSU COMPUTER TECHONOGIES 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;

}

FIO18-C (CERT)

fwrite() が書き込み操作を null 文字で終了すると想

定しない

パターンマッチタイプの静的解析ツールは、関数の内容を評価せずに一致した場合には指摘とする場合が多い。

FIO18-C

欠陥のパターンを多く持っているほど優秀な静的解析ツールと言える。しかし指摘の件数が増えるという欠点もある。

PGRelief QAC/QAC++ LDRA

7/ 24

Page 9: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

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

ビルドキャプチャータイプの静的解析ツール プログラムの動作に着目し、主に制御フロー・データフロー解析を実行するタイプの

静的解析ツールで、実際の欠陥を検出したい場合に有効である。

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

コンパイル

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

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

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;

動的テスト (ランタイムエラー検出)

24: pData = malloc(size);

プログラム・モジュール

テスト・デバック

33: return -1;

コンパイラ呼び出し

ビルドキャプチャ

中間表現

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

静的解析ツール

ビルドキャプチャータイプの 静的解析ツールは、

動的テストと同じ動作が可能

エラー検出

Coverity Quality Advisor Klocwork Insight Fortify SCA CodeSonar

8/ 24

Page 10: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

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

それぞれのツールには、対象となるスコープがあるため、それを理解して使用するツールを選択する必要がある。

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

開発規模 (Steps)

小規模

中規模 100k~

大規模 1M~

PGRelief Coverity Quality Advisor

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

Klocwork Insight

Fortify SCA

コーディング中心の 開発を行う場合

(パターンマッチタイプ)

流用やOSS等を多用する場合、 また集約型の開発を行う場合 (ビルドキャプチャータイプ)

PGRelief スタイルを含め厳格なコーディングを実施する必要がある場合

Fortify SCA ソースコード上のセキュリティ脆弱性を調査したい場合

Klocwork 一つのツールで全ての範囲(コーディング~インテグレーション)をカバーしたい場合

Coverity ソースコード上の欠陥のみを検出し、誤検知・過検知を極力抑えたい場合

上記は弊社の調査結果です。 「過検知」はFCT独自に使用している用語です。

FCT

ではビルドキャプチャータイプの

静的解析ツールを使用してシステムの

故障の発見に重点を置いている

9/ 24

Page 11: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

ソースコードの品質

そもそも、何を検査(レビュー)したいか?

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

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

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

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

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

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

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

保守性

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

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

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

りになっているか?

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

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

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

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

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

機能性 セキュリティ

セキュアなコーディングがされているか?

C

C

C

P

P

P

P

P

P PGRelief C Coverity

10/ 24

Page 12: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

静的解析ツール選択のポイント

その他、静的解析ツールを選択する時の検討項目例

静的解析ツールで検出したい事象

遵守するべきコーディングルール

ROI

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

開発スタイル・開発規模に適した 静的解析ツールを選択しましょう!

11/ 24

Page 13: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

ソースコードに含まれる欠陥の考え方

静的解析ツールで検出できるもの

静的解析ツールの能力

レビューの目標と分析

静的解析ツールを使用した レビュー効率向上のポイント

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

ソフトウェア品質向上セミナー 2015.07.17

12/ 24

Page 14: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

レビューの工数

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人月

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

まだまだ、現実的な工数には程遠い… レビュー可能な件数に絞り込みたい

13/ 24

Page 15: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

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

ISO/IEC 2383-14 JIS X 0014 定義

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

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

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

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

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

ソースコード

実行時

欠陥

欠陥

欠陥

欠陥

故障

故障 指摘

指摘

指摘

指摘

指摘

指摘

静的解析ツールの指摘

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

動的テスト 静的テスト

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

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

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

過検知

欠陥ではあるが 修正は必要ない

誤検知

欠陥ではない

14/ 24

Page 16: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

ソースコード上の欠陥含有率

ソースコード上に含まれる欠陥含有率は、工程に応じて変化する。 レビュー・テストを実施する際、また静的解析ツールを適用する際の指標が必要となる。(下記は成功プロジェクトの平均参考値)

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

実装 単体 結合 統合 詳細 基本 機能

0.9

2.1

2.8

3.5

2.6

2.2

0.3 1.0

2.0

3.0

4.0

Detect / KSteps

Schedule

15/ 24

Page 17: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

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

各ツールベンダーによって、解析結果やレビューに関するポリシー (考え方)が違うため、その特性を理解してツールを選択する必要がある。

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

Positive (検出する)

Negative (検出しない)

過検知?

誤検知?

正検知

Positive (検出する)

Negative (検出しない)

過検知? 誤検知?

正検知

一般的な静的解析ツール Coverity社静的解析ツール

検出数に違いがある

一般的な静的解析ツール Coverity社静的解析ツール

解析結果 欠陥を確実に検出できることに重点を置く為、誤検知・過検知の可能性があっても検出する

実際に発生する故障の検出に重点を置き、誤検知・過検知はなるべく排除する

レビュー 見逃し(Ture Negative)は後工程で開発者の負担となる

誤検知・過検知のレビューは開発者の負担となる

上記は弊社の調査結果です。 「過検知」はFCT独自に使用している用語です。

16/ 24

Page 18: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

静的解析ツールの実力

レビューの品質予測には、静的解析ツールの実力を知ることが必要。 検知(True Positive)を検出する能力(誤ったソースコードを検出する能力)

誤検知(False Positive)を検出しない能力(正しいソースコードを検知しない能力)

静的解析ツール

ソースコード(結合工程)

陰性 (Negative)

True Negative (検知不要)

4985.51 kStep

False Negative (未検知)

5.07kStep

陽性 (Positive)

False Positive (誤検知)

3.39 kStep

True Positive (検知)

5.93 kStep

𝑁𝑒𝑔𝑎𝑡𝑖𝑣𝑒+𝑃𝑜𝑠𝑖𝑡𝑖𝑣𝑒

=100%

正しいソースコード 間違ったソースコード

欠陥含有率 4,989kStep 11 kStep

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED 17/ 24

Page 19: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

正検知率、誤検知率の算出結果

プロプライエタリなソースコード(5M Step)の例

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

欠陥

未検知 F.N.

正検知 T.P.

誤検知 F.P.

誤検知率:0.068%

正検知率:53.90%

100%

T.N.

(5569件?)

6501件

3242件

99.78% 0.22%

欠陥なし 正しいソースコード

欠陥あり 欠陥を含むソースコード

陰性(Negative) 99.932% 46.10%

陽性(Positive) 0.068% 53.90%

100% 欠陥なし

18/ 24

Page 20: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

ベイズの定理応用例

静的解析ツールを使用して解析結果が与えらとき、斜線面積の広さが、 欠陥の発生する確率を示している

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

OVERRUN

UNINIT_CTOR クラス内での未初期化

RESOURCE_LEAK リーク

UNINIT

USER_AFTER_FREE解放後のアクセス

FORWARD_NULL STRING_OVERFLOW オーバフロー

REVERSE_INULL BAD_SIZEOF

DIVIDE_BY_ZEROゼロ除算

31% 25% 13% 9% 8% 4% 3%... 1%

33%

75%

59%

15%

71%

50%

71%

58%

80%

0.1023 (20%)

0.1875 (36%)

0.0767 (15%)

0.0135 (3%)

0.0568 (11%)

0.0

2 (

4%

)

0.0

21

3(4

%)

0.0

17

4(3

%)

0.0

24

(5%

)

19/ 24

Page 21: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

レビュー効率向上のポイント

その他、レビュー効率向上の検討事項 静的解析ツールの特色(ポリシー)

静的解析ツールの検出能力

レビューそのものの状況把握

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

静的解析ツールは、 過検知・誤検知があることを前提に

目標を設定してからレビュー実施しましょう!

20/ 24

Page 22: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

静的解析ツールの選択とレビューの効率化のポイント

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

まとめ

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

ソフトウェア品質向上セミナー 2015.07.17

21/ 24

Page 23: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

まとめ

① 静的解析ツールの選択ポイント

② 静的解析ツールを使用したレビュー効率向上のポイント

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

開発スタイル・開発規模に適した 静的解析ツールを選択しましょう!

静的解析ツールは、 過検知・誤検知があることを前提に

目標を設定してからレビュー実施しましょう!

22/ 24

Page 24: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

サービスメニュー概要

ソースコード品質・レビュー品質を改善するサービスメニュー

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED

P

D

C

A

コーディング規約

静的解析

傾向分析・詳細分析

コーディング

解析結果

規約作成支援

レビュー 未検知分析

レビュー支援

コード修正

サービス概要

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

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

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

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

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

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

弊社のサービス

お客様のプロセス・資産

23/ 24

Page 25: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく

商標について 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.の登録商標です。

その他の会社名、商品名は各社の商標、または登録商標です。

Copyright 2015 FUJITSU COMPUTER TECHONOGIES LIMITED 24/ 24

Page 26: ソースコード品質・レビュー品質 を改善するポイント - Fujitsu · 2019-03-23 · ソースコードを改版する際に、プログラムへの影響が少ないつく