SlideShare a Scribd company logo
1 of 20
Download to read offline
靜態程式碼分析簡介 
Visual Studio 2012 
2013/9/26 
1
Overview 
 靜態程式碼分析是什麼 
 為何需要 
 靜態程式碼分析的種類 
 使用時機 
 優缺點 
 Visual Studio 2012所提供的功能 
2
靜態程式碼分析是什麼 
檢測非執行期(run time)程式碼的錯誤或缺陷 
3 
分析並標定有問題程式碼的位置 
確保程式開發風格的一致性 
度量程式碼品質的指標(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 
• 自動化及效率 
• 擁有多種面向的檢測能力 
• 完整的檢查涵蓋率 
• 沒有偏見
靜態程式碼分析的種類 
資料來源:http://www2.swc.toshiba.co.jp/en/tech/design.htm 
8
使用靜態程式碼分析的時機 
9 
教育訓練 
• 協助新進同仁遵循內部程式設計規定及風格 
• 檢查新手的程式碼品質 
• 教師可以快速評量學員的學習效果 
系統平台移植 
• 平台移植很難預知會遇到什麼問題 
• 利用工具協助找出可能有問題的程式碼 
風險評估 
• 檢查程式外包或使用第三方開發的程式 
• 檢查開放原始碼的程式庫 
程式碼重構• 協助找出需要被重構的程式碼 
找出程式設計缺 
失 
• 程式設計時期便可及早指出錯誤 
• 穩定及易於維護的程式
靜態程式碼分析的優點 
改善程式碼品質及程式的穩定性、安全性 
透過早期檢測, 以降低程式上線後修正錯誤的成本 
建立內部開發一致的風格及規範 
自動化工具可提供涵蓋完整程式碼的測試 
發現很少使用到的程式碼裡的缺失 
沒有系統環境或編譯器的限制 
可產出標定錯誤的位置及清單 
10
靜態程式碼分析的不足之處 
工具非100%可信,有誤報或漏報錯誤的機率 
漏報(False-negatives)產生安全假像, 且可能增加維護成本 
誤報(False-positives)產生不必要的檢查工作且延遲上線時程 
自動化工具無法檢查業務邏輯和演算法的錯誤 
導入已進行中的專案時,可能使預定開發週期延長 
11 
工作習慣及組織文化的改變 
教育訓練及學習的時間成本
Visual Studio 2012提供的功能 
程式碼檢閱要求及回應(Code Review and Feedback) 
• 結合工作項目 
• 透過「Team Explorer」視窗發出「要求檢 
12 
閱」 
• 檢閱者透過Visual Studio自動以程式碼檢閱 
的方式開啟原始檔,閱讀內容並加入註解 
• 僅限Premium和Ultimate
Visual Studio 2012提供的功能 
分析程式碼複製品(code clone detection) 
13 
• 自動分析方案中相似的程式碼區塊 
• 透過複選程式碼行以指定程式碼範本, 
讓Visual Studio尋找近似的程式碼區塊 
• 僅限Premium和Ultimate 
!?
Visual Studio 2012提供的功能 
14 
程式碼度量(code metrics) 
• 將軟體設計或規格加以量測與量化
Visual Studio 2012提供的功能 
15 
程式碼度量項目 
循環複雜度 
(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)
Visual Studio 2012提供的功能 
16 
靜態程式碼分析 
在執行或部署程式碼前先發現錯誤或弱點 
大範圍的檢查 
• 從程式碼寫作風格到減少安全疑慮 
可以整合到原始碼控管與組建 
• 程式碼分析簽入原則 
• 定義不合分析的結果為警告還是錯誤 
使用預先設計好的規範 
可使用Rule Set editor 客製化 
• 要涵蓋哪些檢測 
• 要回報成錯誤還是警告 
• 建立客製化的規則集 
例外情況可以隱藏警告, 規避掃描及嵌入原則 
• 使用功能表項目隱藏警告 
• 使用SuppressMessage Attribute隱藏警告
Visual Studio 2012提供的功能 
程式建置時一併檢查 
17 
靜態程式碼分析 
使用預設的規則集 
客製規則集 
詳細規則集說明請參考MSDN:http://msdn.microsoft.com/zh-tw/library/dd264925.aspx
Visual Studio 2012提供的功能 
Visual Studio 2012提供的警告(Warning)項目 
Design 設計• Follow Microsoft 開發.NET Framework設計方針的警告 
Globalization 全球化•全球化設計的警告 
Interoperability互通性•與COM元件用戶端互動的警告 
Maintainability 維護性•程式庫和應用程式的可維護性警告 
Mobility 行動力•針對著重節電的程式設計警告 
Naming 命名•遵守.NET Framework 設計方針之命名慣例的警告 
Performance 效能•著重高效能函式庫和應用程式的警告 
Portability 可攜性•跨平台設計的警告 
Reliability可靠性•函式庫和應用程式可靠性警告,如正確的記憶體和執行緒用法 
Security 安全性•比Design所列項目更安全之函式庫及應用程式的警告 
Usage 用法•妥善使用.NET Framework所提供功能的警告 
Native 原生•針對撰寫C/C++等原生程式設計的警告 
詳細說明請參考MSDN:http://msdn.microsoft.com/zh-tw/library/ee1hzekz.aspx 
18
Visual Studio 2012提供的功能 
初次導入,可從「最小建議規則」規則集開始導入建議 
逐步加入更多規則或規則集來找出並更正其他問題 
依專案特性來選擇適合的選項 
可使用現成的規則集來修改 
一般專案可以「Microsoft Managed建議規則」為主 
Microsoft建議:為專案建立的任何自訂規則集中都包含這個規則集 
由專案的架構師主持規則集討論及制定 
19
Q&A 
20

More Related Content

What's hot

Git 實務圖解
Git 實務圖解Git 實務圖解
Git 實務圖解Pokai Chang
 
Rouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecRouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecPacSecJP
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
TDOH Conf-APP檢測之經驗分享
TDOH Conf-APP檢測之經驗分享TDOH Conf-APP檢測之經驗分享
TDOH Conf-APP檢測之經驗分享Tzu-Ting(Fei) Lin
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
NTUSTxTDOH - Pwn基礎 2015/12/27
NTUSTxTDOH - Pwn基礎 2015/12/27NTUSTxTDOH - Pwn基礎 2015/12/27
NTUSTxTDOH - Pwn基礎 2015/12/27Sheng-Hao Ma
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿MITSUNARI Shigeo
 
ROP 輕鬆談
ROP 輕鬆談ROP 輕鬆談
ROP 輕鬆談hackstuff
 
YOW2021 Computing Performance
YOW2021 Computing PerformanceYOW2021 Computing Performance
YOW2021 Computing PerformanceBrendan Gregg
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and moreBrendan Gregg
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いRetrieva inc.
 
nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話Masaki Yamamoto
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Brendan Gregg
 
わたしを支える技術
わたしを支える技術わたしを支える技術
わたしを支える技術yoku0825
 
超簡単!FirefoxブラウザをWindows Server 2019にインストール!
超簡単!FirefoxブラウザをWindows Server 2019にインストール!超簡単!FirefoxブラウザをWindows Server 2019にインストール!
超簡単!FirefoxブラウザをWindows Server 2019にインストール!Shin Tanigawa
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Wen-Tien Chang
 
Linux Performance Analysis and Tools
Linux Performance Analysis and ToolsLinux Performance Analysis and Tools
Linux Performance Analysis and ToolsBrendan Gregg
 
Git超入門_座学編.pdf
Git超入門_座学編.pdfGit超入門_座学編.pdf
Git超入門_座学編.pdf憲昭 村田
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?ichirin2501
 
コンピュータフォレンジックにちょっとだけ触れてみる
コンピュータフォレンジックにちょっとだけ触れてみるコンピュータフォレンジックにちょっとだけ触れてみる
コンピュータフォレンジックにちょっとだけ触れてみるinfinite_loop
 

What's hot (20)

Git 實務圖解
Git 實務圖解Git 實務圖解
Git 實務圖解
 
Rouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsecRouault imbert alpc_rpc_pacsec
Rouault imbert alpc_rpc_pacsec
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
TDOH Conf-APP檢測之經驗分享
TDOH Conf-APP檢測之經驗分享TDOH Conf-APP檢測之經驗分享
TDOH Conf-APP檢測之經驗分享
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
NTUSTxTDOH - Pwn基礎 2015/12/27
NTUSTxTDOH - Pwn基礎 2015/12/27NTUSTxTDOH - Pwn基礎 2015/12/27
NTUSTxTDOH - Pwn基礎 2015/12/27
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
 
ROP 輕鬆談
ROP 輕鬆談ROP 輕鬆談
ROP 輕鬆談
 
YOW2021 Computing Performance
YOW2021 Computing PerformanceYOW2021 Computing Performance
YOW2021 Computing Performance
 
BPF: Tracing and more
BPF: Tracing and moreBPF: Tracing and more
BPF: Tracing and more
 
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違いLinuxカーネルを読んで改めて知るプロセスとスレッドの違い
Linuxカーネルを読んで改めて知るプロセスとスレッドの違い
 
nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話
 
Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)Performance Wins with eBPF: Getting Started (2021)
Performance Wins with eBPF: Getting Started (2021)
 
わたしを支える技術
わたしを支える技術わたしを支える技術
わたしを支える技術
 
超簡単!FirefoxブラウザをWindows Server 2019にインストール!
超簡単!FirefoxブラウザをWindows Server 2019にインストール!超簡単!FirefoxブラウザをWindows Server 2019にインストール!
超簡単!FirefoxブラウザをWindows Server 2019にインストール!
 
Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀Git 版本控制系統 -- 從微觀到宏觀
Git 版本控制系統 -- 從微觀到宏觀
 
Linux Performance Analysis and Tools
Linux Performance Analysis and ToolsLinux Performance Analysis and Tools
Linux Performance Analysis and Tools
 
Git超入門_座学編.pdf
Git超入門_座学編.pdfGit超入門_座学編.pdf
Git超入門_座学編.pdf
 
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
 
コンピュータフォレンジックにちょっとだけ触れてみる
コンピュータフォレンジックにちょっとだけ触れてみるコンピュータフォレンジックにちょっとだけ触れてみる
コンピュータフォレンジックにちょっとだけ触れてみる
 

Similar to Static Code Analysis 靜態程式碼分析

有效的单元测试.ppt
有效的单元测试.ppt有效的单元测试.ppt
有效的单元测试.ppttest499702
 
Web testing automation
Web testing automationWeb testing automation
Web testing automationkuozui
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章浒 刘
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天Gelis Wu
 
常用JAVA代码质量静态检查工具
常用JAVA代码质量静态检查工具常用JAVA代码质量静态检查工具
常用JAVA代码质量静态检查工具dearhwj
 
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby建興 王
 
Appium手机自动化测试 testerhome_bqcon版本
Appium手机自动化测试 testerhome_bqcon版本Appium手机自动化测试 testerhome_bqcon版本
Appium手机自动化测试 testerhome_bqcon版本延胜 黄
 
TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學潘 冠辰
 
I os与android多平台开发心得
I os与android多平台开发心得I os与android多平台开发心得
I os与android多平台开发心得drewz lin
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Kirk Chen
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Jun Liu
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)悦 温
 
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)Rick Hwang
 
如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12twMVC
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發twMVC
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Gelis Wu
 

Similar to Static Code Analysis 靜態程式碼分析 (20)

有效的单元测试.ppt
有效的单元测试.ppt有效的单元测试.ppt
有效的单元测试.ppt
 
Web testing automation
Web testing automationWeb testing automation
Web testing automation
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第四天
 
常用JAVA代码质量静态检查工具
常用JAVA代码质量静态检查工具常用JAVA代码质量静态检查工具
常用JAVA代码质量静态检查工具
 
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
 
Appium手机自动化测试 testerhome_bqcon版本
Appium手机自动化测试 testerhome_bqcon版本Appium手机自动化测试 testerhome_bqcon版本
Appium手机自动化测试 testerhome_bqcon版本
 
TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學
 
I os与android多平台开发心得
I os与android多平台开发心得I os与android多平台开发心得
I os与android多平台开发心得
 
Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016Open source的devops工具箱 公開版@coscup2016
Open source的devops工具箱 公開版@coscup2016
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
 
Android工作坊
Android工作坊Android工作坊
Android工作坊
 
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
從理想、到現實的距離,開啟品味軟體測試之路 - 台灣軟體工程協會 (20220813)
 
如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12如何在實務上使用TDD來開發 twmvc#12
如何在實務上使用TDD來開發 twmvc#12
 
Xpp
XppXpp
Xpp
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發twMVC#12 | 如何在實務上使用 TDD 來開發
twMVC#12 | 如何在實務上使用 TDD 來開發
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
 

More from Bill Lin

Dependency injection in asp.net core
Dependency injection in asp.net coreDependency injection in asp.net core
Dependency injection in asp.net coreBill Lin
 
Introduction the Repository Pattern
Introduction the Repository PatternIntroduction the Repository Pattern
Introduction the Repository PatternBill Lin
 
T-SQL: Pivot, Unpivot, Except, Intersect
T-SQL: Pivot, Unpivot, Except, IntersectT-SQL: Pivot, Unpivot, Except, Intersect
T-SQL: Pivot, Unpivot, Except, IntersectBill Lin
 
Responsive Web Design 響應式網頁設計
Responsive Web Design 響應式網頁設計Responsive Web Design 響應式網頁設計
Responsive Web Design 響應式網頁設計Bill Lin
 
Internet Explorer相容性設計考量
Internet Explorer相容性設計考量Internet Explorer相容性設計考量
Internet Explorer相容性設計考量Bill Lin
 
Design pattern strategy pattern 策略模式
Design pattern strategy pattern 策略模式Design pattern strategy pattern 策略模式
Design pattern strategy pattern 策略模式Bill Lin
 

More from Bill Lin (6)

Dependency injection in asp.net core
Dependency injection in asp.net coreDependency injection in asp.net core
Dependency injection in asp.net core
 
Introduction the Repository Pattern
Introduction the Repository PatternIntroduction the Repository Pattern
Introduction the Repository Pattern
 
T-SQL: Pivot, Unpivot, Except, Intersect
T-SQL: Pivot, Unpivot, Except, IntersectT-SQL: Pivot, Unpivot, Except, Intersect
T-SQL: Pivot, Unpivot, Except, Intersect
 
Responsive Web Design 響應式網頁設計
Responsive Web Design 響應式網頁設計Responsive Web Design 響應式網頁設計
Responsive Web Design 響應式網頁設計
 
Internet Explorer相容性設計考量
Internet Explorer相容性設計考量Internet Explorer相容性設計考量
Internet Explorer相容性設計考量
 
Design pattern strategy pattern 策略模式
Design pattern strategy pattern 策略模式Design pattern strategy pattern 策略模式
Design pattern strategy pattern 策略模式
 

Static Code Analysis 靜態程式碼分析

  • 2. Overview  靜態程式碼分析是什麼  為何需要  靜態程式碼分析的種類  使用時機  優缺點  Visual Studio 2012所提供的功能 2
  • 3. 靜態程式碼分析是什麼 檢測非執行期(run time)程式碼的錯誤或缺陷 3 分析並標定有問題程式碼的位置 確保程式開發風格的一致性 度量程式碼品質的指標(code metrics)
  • 4. 為何需要做靜態程式碼分析 4 系統被掃出一堆弱點 程式上線後出現效能問題 花許多時間在討論命名跟風格的問題 花更多時間解釋一個很難懂,需要作者逐行解釋的函數 引用前輩的sample code卻出了一堆bug 好像在哪看過與這段一模一樣的程式碼 看一個函數捲了好幾頁還沒結束 總要花一堆時間教新進同仁內部的開發規範 想重構卻不知從何下手 ……
  • 5. 為何需要做靜態程式碼分析 5 早期發現早期治療 Coding階段揪出問題,好過上線後開事件單 避免前朝遺毒發作 建立一致的coding規範 微軟開發Visual Studio 產品所得到的經驗: • Code review 過的程式碼仍有86% 的bug • 整體bug 中60% 是coding errors
  • 6. 為何需要做靜態程式碼分析 6 品質指標:  撰寫風格一致性  複雜度  程式區塊深度  類別繼承深度  程式碼相似度  程式弱點掃描 目的:  可維護性  設計的彈性  安全  效能
  • 7. 靜態程式碼分析的種類 靜態程式 碼分析 7 Code Review • 由不同角色的團隊成員分別 檢視 • 突破程式作者盲點 • 檢查資安漏洞及業務邏輯 • 較易理解審查規則 Automated Tools • 自動化及效率 • 擁有多種面向的檢測能力 • 完整的檢查涵蓋率 • 沒有偏見
  • 9. 使用靜態程式碼分析的時機 9 教育訓練 • 協助新進同仁遵循內部程式設計規定及風格 • 檢查新手的程式碼品質 • 教師可以快速評量學員的學習效果 系統平台移植 • 平台移植很難預知會遇到什麼問題 • 利用工具協助找出可能有問題的程式碼 風險評估 • 檢查程式外包或使用第三方開發的程式 • 檢查開放原始碼的程式庫 程式碼重構• 協助找出需要被重構的程式碼 找出程式設計缺 失 • 程式設計時期便可及早指出錯誤 • 穩定及易於維護的程式
  • 10. 靜態程式碼分析的優點 改善程式碼品質及程式的穩定性、安全性 透過早期檢測, 以降低程式上線後修正錯誤的成本 建立內部開發一致的風格及規範 自動化工具可提供涵蓋完整程式碼的測試 發現很少使用到的程式碼裡的缺失 沒有系統環境或編譯器的限制 可產出標定錯誤的位置及清單 10
  • 11. 靜態程式碼分析的不足之處 工具非100%可信,有誤報或漏報錯誤的機率 漏報(False-negatives)產生安全假像, 且可能增加維護成本 誤報(False-positives)產生不必要的檢查工作且延遲上線時程 自動化工具無法檢查業務邏輯和演算法的錯誤 導入已進行中的專案時,可能使預定開發週期延長 11 工作習慣及組織文化的改變 教育訓練及學習的時間成本
  • 12. Visual Studio 2012提供的功能 程式碼檢閱要求及回應(Code Review and Feedback) • 結合工作項目 • 透過「Team Explorer」視窗發出「要求檢 12 閱」 • 檢閱者透過Visual Studio自動以程式碼檢閱 的方式開啟原始檔,閱讀內容並加入註解 • 僅限Premium和Ultimate
  • 13. Visual Studio 2012提供的功能 分析程式碼複製品(code clone detection) 13 • 自動分析方案中相似的程式碼區塊 • 透過複選程式碼行以指定程式碼範本, 讓Visual Studio尋找近似的程式碼區塊 • 僅限Premium和Ultimate !?
  • 14. Visual Studio 2012提供的功能 14 程式碼度量(code metrics) • 將軟體設計或規格加以量測與量化
  • 15. Visual Studio 2012提供的功能 15 程式碼度量項目 循環複雜度 (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提供的功能 16 靜態程式碼分析 在執行或部署程式碼前先發現錯誤或弱點 大範圍的檢查 • 從程式碼寫作風格到減少安全疑慮 可以整合到原始碼控管與組建 • 程式碼分析簽入原則 • 定義不合分析的結果為警告還是錯誤 使用預先設計好的規範 可使用Rule Set editor 客製化 • 要涵蓋哪些檢測 • 要回報成錯誤還是警告 • 建立客製化的規則集 例外情況可以隱藏警告, 規避掃描及嵌入原則 • 使用功能表項目隱藏警告 • 使用SuppressMessage Attribute隱藏警告
  • 17. Visual Studio 2012提供的功能 程式建置時一併檢查 17 靜態程式碼分析 使用預設的規則集 客製規則集 詳細規則集說明請參考MSDN:http://msdn.microsoft.com/zh-tw/library/dd264925.aspx
  • 18. Visual Studio 2012提供的功能 Visual Studio 2012提供的警告(Warning)項目 Design 設計• Follow Microsoft 開發.NET Framework設計方針的警告 Globalization 全球化•全球化設計的警告 Interoperability互通性•與COM元件用戶端互動的警告 Maintainability 維護性•程式庫和應用程式的可維護性警告 Mobility 行動力•針對著重節電的程式設計警告 Naming 命名•遵守.NET Framework 設計方針之命名慣例的警告 Performance 效能•著重高效能函式庫和應用程式的警告 Portability 可攜性•跨平台設計的警告 Reliability可靠性•函式庫和應用程式可靠性警告,如正確的記憶體和執行緒用法 Security 安全性•比Design所列項目更安全之函式庫及應用程式的警告 Usage 用法•妥善使用.NET Framework所提供功能的警告 Native 原生•針對撰寫C/C++等原生程式設計的警告 詳細說明請參考MSDN:http://msdn.microsoft.com/zh-tw/library/ee1hzekz.aspx 18
  • 19. Visual Studio 2012提供的功能 初次導入,可從「最小建議規則」規則集開始導入建議 逐步加入更多規則或規則集來找出並更正其他問題 依專案特性來選擇適合的選項 可使用現成的規則集來修改 一般專案可以「Microsoft Managed建議規則」為主 Microsoft建議:為專案建立的任何自訂規則集中都包含這個規則集 由專案的架構師主持規則集討論及制定 19