Upload
bill-lin
View
525
Download
4
Embed Size (px)
DESCRIPTION
Static Code Analysis 靜態程式碼分析
Citation preview
4
為何需要做靜態程式碼分析系統被掃出一堆弱點
程式上線後出現效能問題
花許多時間在討論命名跟風格的問題
花更多時間解釋一個很難懂,需要作者逐行解釋的函數
引用前輩的sample code卻出了一堆bug
好像在哪看過與這段一模一樣的程式碼
看一個函數捲了好幾頁還沒結束
總要花一堆時間教新進同仁內部的開發規範
想重構卻不知從何下手
……
為何需要做靜態程式碼分析
5
早期發現早期治療
Coding階段揪出問題,好過上線後開事件單
避免前朝遺毒發作
建立一致的coding規範
微軟開發 Visual Studio 產品所得到的經驗:
• Code review 過的程式碼仍有 86% 的 bug
• 整體 bug 中 60% 是 coding errors
靜態程式碼分析的種類
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
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建議:為專案建立的任何自訂規則集中都包含這個規則集
可使用現成的規則集來修改
依專案特性來選擇適合的選項
逐步加入更多規則或規則集來找出並更正其他問題
初次導入,可從「最小建議規則」規則集開始導入建議