20
1 靜態程式碼分析簡介 Visual Studio 2012 2013/9/26

Static Code Analysis 靜態程式碼分析

Embed Size (px)

DESCRIPTION

Static Code Analysis 靜態程式碼分析

Citation preview

1

靜態程式碼分析簡介

Visual Studio 2012

2013/9/26

2

靜態程式碼分析是什麼為何需要靜態程式碼分析的種類使用時機優缺點Visual Studio 2012所提供的功能

Overview

3

靜態程式碼分析是什麼

檢測非執行期(run time)程式碼的錯誤或缺陷

分析並標定有問題程式碼的位置

確保程式開發風格的一致性

度量程式碼品質的指標(code metrics)

4

為何需要做靜態程式碼分析系統被掃出一堆弱點

程式上線後出現效能問題

花許多時間在討論命名跟風格的問題

花更多時間解釋一個很難懂,需要作者逐行解釋的函數

引用前輩的sample code卻出了一堆bug

好像在哪看過與這段一模一樣的程式碼

看一個函數捲了好幾頁還沒結束

總要花一堆時間教新進同仁內部的開發規範

想重構卻不知從何下手

……

為何需要做靜態程式碼分析

5

早期發現早期治療

Coding階段揪出問題,好過上線後開事件單

避免前朝遺毒發作

建立一致的coding規範

微軟開發 Visual Studio 產品所得到的經驗:

• Code review 過的程式碼仍有 86% 的 bug

• 整體 bug 中 60% 是 coding errors

6

品質指標: 撰寫風格一致性 複雜度 程式區塊深度 類別繼承深度 程式碼相似度 程式弱點掃描

目的: 可維護性 設計的彈性 安全 效能

為何需要做靜態程式碼分析

靜態程式碼分析的種類

7

靜態程式

碼分析

Code Review

•由不同角色的團隊成員分別

檢視

•突破程式作者盲點

•檢查資安漏洞及業務邏輯

•較易理解審查規則

Automated Tools

•自動化及效率

•擁有多種面向的檢測能力

•完整的檢查涵蓋率

•沒有偏見

靜態程式碼分析的種類

8

資料來源:http://www2.swc.toshiba.co.jp/en/tech/design.htm

使用靜態程式碼分析的時機

9

教育訓練

• 協助新進同仁遵循內部程式設計規定及風格

• 檢查新手的程式碼品質

• 教師可以快速評量學員的學習效果

系統平台移植• 平台移植很難預知會遇到什麼問題

• 利用工具協助找出可能有問題的程式碼

風險評估• 檢查程式外包或使用第三方開發的程式

• 檢查開放原始碼的程式庫

程式碼重構 • 協助找出需要被重構的程式碼

找出程式設計缺

• 程式設計時期便可及早指出錯誤

• 穩定及易於維護的程式

靜態程式碼分析的優點

10

改善程式碼品質及程式的穩定性、安全性

透過早期檢測,以降低程式上線後修正錯誤的成本

建立內部開發一致的風格及規範

自動化工具可提供涵蓋完整程式碼的測試

發現很少使用到的程式碼裡的缺失

沒有系統環境或編譯器的限制

可產出標定錯誤的位置及清單

靜態程式碼分析的不足之處

11

工具非100%可信,有誤報或漏報錯誤的機率

漏報(False-negatives)產生安全假像, 且可能增加維護成本

誤報(False-positives)產生不必要的檢查工作且延遲上線時程

自動化工具無法檢查業務邏輯和演算法的錯誤

導入已進行中的專案時,可能使預定開發週期延長

工作習慣及組織文化的改變

教育訓練及學習的時間成本

Visual Studio 2012提供的功能

12

程式碼檢閱要求及回應(Code Review and Feedback)

• 結合工作項目• 透過「Team Explorer」視窗發出「要求檢閱」

• 檢閱者透過Visual Studio自動以程式碼檢閱的方式開啟原始檔,閱讀內容並加入註解

• 僅限Premium和Ultimate

13

Visual Studio 2012提供的功能分析程式碼複製品(code clone detection)

!?

• 自動分析方案中相似的程式碼區塊• 透過複選程式碼行以指定程式碼範本,讓Visual Studio尋找近似的程式碼區塊

• 僅限Premium和Ultimate

14

程式碼度量(code metrics)

Visual Studio 2012提供的功能

• 將軟體設計或規格加以量測與量化

15

Visual Studio 2012提供的功能程式碼度量項目

循環複雜度

(Cyclomatic Complexity)

• 程式碼分歧路徑越多,循環複雜度越高。

•循環複雜度太高,控制流程複雜的程式需要較多的測試,才能達到較高的程式碼涵蓋

繼承深度 • 繼承的深度越深,代表父類別越無法彈性的修改

類別耦合程度

(Class Coupling)

• 透過參數、區域變數、傳回型別、方法呼叫、泛型、基底型別、介面實作、外部類別

上定義的欄位、屬性修飾…等,測量類別的耦合程度

• 耦合程度高表示設計不易重複使用,因這種設計包含對其他類別的許多相依性

•良好的軟體設計應具備高內聚(Cohesion)且低耦合(Coupling)的類別和方法

程式碼行數

• 數目以 IL 程式碼為依據,因此不是原始程式碼檔案中精確的行數。

•若數目非常大,表示類別/方法嘗試執行的工作可能過多,應分割工作。也表示該類別

/方法可能難以維護。

可維護性指數

(Maintainability Index)

• 由SEI提出的綜合性的指標,參數由前面幾項指標算出可維護性的指數有多高

•值介於 0 到 100 之間,愈高愈佳

•微軟建議:門檻值20~100為高維護性,綠燈。10~20為中維護性,黃燈。0~10為

低維護性,紅燈。

• 計算公式:171 - 5.2 * log2(Halstead Volume) - 0.23 * (Cyclomatic Complexity) -

16.2 * log2(Lines of Code)

16

靜態程式碼分析

Visual Studio 2012提供的功能

在執行或部署程式碼前先發現錯誤或弱點

大範圍的檢查

• 從程式碼寫作風格到減少安全疑慮

可以整合到原始碼控管與組建

• 程式碼分析簽入原則

• 定義不合分析的結果為警告還是錯誤

使用預先設計好的規範

可使用Rule Set editor 客製化

• 要涵蓋哪些檢測

• 要回報成錯誤還是警告

• 建立客製化的規則集

例外情況可以隱藏警告,規避掃描及嵌入原則

• 使用功能表項目隱藏警告

• 使用 SuppressMessage Attribute隱藏警告

17

Visual Studio 2012提供的功能靜態程式碼分析

使用預設的規則集

程式建置時一併檢查

客製規則集

詳細規則集說明請參考MSDN:http://msdn.microsoft.com/zh-tw/library/dd264925.aspx

18

Visual Studio 2012提供的功能

• Follow Microsoft 開發.NET Framework設計方針的警告Design 設計

•全球化設計的警告Globalization 全球化

•與COM元件用戶端互動的警告Interoperability 互通性

•程式庫和應用程式的可維護性警告Maintainability 維護性

•針對著重節電的程式設計警告Mobility 行動力

•遵守 .NET Framework 設計方針之命名慣例的警告Naming 命名

•著重高效能函式庫和應用程式的警告Performance 效能

•跨平台設計的警告Portability 可攜性

•函式庫和應用程式可靠性警告,如正確的記憶體和執行緒用法Reliability 可靠性

•比Design所列項目更安全之函式庫及應用程式的警告Security 安全性

•妥善使用.NET Framework所提供功能的警告Usage 用法

•針對撰寫C/C++等原生程式設計的警告Native 原生

Visual Studio 2012提供的警告(Warning)項目

詳細說明請參考MSDN:http://msdn.microsoft.com/zh-tw/library/ee1hzekz.aspx

19

Visual Studio 2012提供的功能

由專案的架構師主持規則集討論及制定

一般專案可以「Microsoft Managed建議規則」為主Microsoft建議:為專案建立的任何自訂規則集中都包含這個規則集

可使用現成的規則集來修改

依專案特性來選擇適合的選項

逐步加入更多規則或規則集來找出並更正其他問題

初次導入,可從「最小建議規則」規則集開始導入建議

Q&A

20