大綱
一、靜態(tài)代碼分析技術(shù)和工具 靜態(tài)代碼分析是指無需運行被測代碼,僅通過分析或檢查源程序的語法、結(jié)構(gòu)、過程、接口等來檢查程序的正確性,找出代碼隱藏的錯誤和缺陷,如參數(shù)不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現(xiàn)的空指針引用等等。 常見靜態(tài)代碼分析技術(shù)
常見靜態(tài)代碼分析工具 C++、DevOps、DevSecOps、敏捷開發(fā)、速度和左移策略,這些話題總是說不完道不盡,但這些也都與靜態(tài)代碼分析工具息息相關(guān)。這樣看來,靜態(tài)代碼分析的前景不容忽視。 靜態(tài)代碼檢測工具的作用和優(yōu)點1. 發(fā)現(xiàn)潛在問題:靜態(tài)代碼檢測工具可以發(fā)現(xiàn)代碼中存在的潛在問題和缺陷,比如內(nèi)存泄漏、空指針引用、資源泄漏等,幫助開發(fā)人員及時修復(fù),提高代碼質(zhì)量。 2. 提高代碼可維護(hù)性:靜態(tài)代碼檢測工具能夠發(fā)現(xiàn)代碼中的一些不規(guī)范的寫法和潛在的問題,幫助開發(fā)人員遵循編碼規(guī)范,提高代碼的可讀性和可維護(hù)性。 3. 加速開發(fā)流程:靜態(tài)代碼檢測工具能夠自動化進(jìn)行代碼分析和檢查,大大減少了手動代碼審查的工作量,提高了開發(fā)效率。 4. 提高安全性:靜態(tài)代碼檢測工具能夠發(fā)現(xiàn)代碼中存在的安全漏洞和潛在的安全問題,如SQL注入、跨站腳本攻擊等,幫助開發(fā)人員及時修復(fù),提高系統(tǒng)的安全性。 常見靜態(tài)代碼檢測工具SonarQube:SonarQube是一個開源的靜態(tài)代碼檢測平臺,支持多種編程語言,如Java、C++、C#、Python等。它能夠檢測代碼中的潛在問題、漏洞、代碼重復(fù)和代碼覆蓋率,并提供詳細(xì)的報告和建議。 FindBugs:FindBugs是一個基于靜態(tài)分析的Java代碼缺陷檢測工具,它能夠檢測出代碼中的潛在問題、錯誤和不良實踐,并給出相應(yīng)的修復(fù)建議。FindBugs的規(guī)則庫非常豐富,并且支持自定義規(guī)則。 WuKong:WuKong是一款國產(chǎn)靜態(tài)代碼檢測工具,支持多種語言,如Java、C++、C#、Python、PHP等??梢詸z測編碼規(guī)則、缺陷及安全漏洞并給出修復(fù)建議。WuKong兼容麒麟、龍芯等國產(chǎn)軟硬件,擁有自主知識產(chǎn)權(quán),可靈活進(jìn)行定制。 Coverity:Coverity支持超過20種編譯器(主要C/C++),可在編譯不通過情況下檢測,是一款針對C、C++、C#和Java等編程語言的靜態(tài)代碼檢測工具,它能夠檢測代碼中的潛在問題、漏洞和性能問題,并給出相應(yīng)的修復(fù)建議。Coverity具有高度可定制性和可擴(kuò)展性。 Fortify:支持規(guī)則自定義,包括合規(guī)信息的識別。支持Java、C#、C/C++、Python、Ruby 等超20種語言。它更側(cè)重于安全漏洞檢測,支持規(guī)則自定義,包括合規(guī)信息的識別。Fortify通過基于規(guī)則和漏洞模式的檢測引擎來分析代碼,識別安全漏洞并提供相應(yīng)的修復(fù)建議。 Checkmarx:Checkmarx支持多種語言,如Java、JSP、JavaSript、 VBSript、C#等超20種語言。它能夠查找安全漏洞、質(zhì)量缺陷、邏輯問題等。CxSAST無需搭建軟件項目源代碼的構(gòu)建環(huán)境即可對代碼進(jìn)行數(shù)據(jù)流分析。 二、AST抽象語法樹技術(shù) 什么是AST語法樹? 抽象語法樹(Abstract Syntax Tree,簡稱AST)是源代碼的抽象語法結(jié)構(gòu)在計算機(jī)內(nèi)存中的表現(xiàn)形式。它是編譯器或解釋器在處理源代碼時所使用的一種中間表示形式。AST在編譯和代碼生成過程中起著關(guān)鍵作用。 AST中的每個節(jié)點表示源代碼中的一個語法構(gòu)造,如變量聲明、表達(dá)式、函數(shù)調(diào)用、控制結(jié)構(gòu)等。樹的根節(jié)點通常表示整個源代碼文件,而子節(jié)點表示具體的語法元素及其關(guān)系。例如,一個函數(shù)聲明的AST節(jié)點可能包含多個子節(jié)點,如函數(shù)名、參數(shù)列表和函數(shù)體等。 為什么要了解AST
AST是如何生成的抽象語法樹(AST)的生成通常是編譯器或解釋器在處理源代碼的過程中產(chǎn)生的。生成AST的過程可以分為以下幾個步驟:
AST的具體作用抽象語法樹(AST)在編程語言處理和軟件工程中發(fā)揮著關(guān)鍵作用。它是源代碼的結(jié)構(gòu)化表示,捕捉了源代碼中的語法結(jié)構(gòu)和關(guān)系。AST具有以下幾個主要作用:
總之,AST在編程語言處理和軟件工程中具有廣泛的應(yīng)用,它為分析、優(yōu)化和生成代碼提供了結(jié)構(gòu)化的基礎(chǔ)。了解AST有助于更深入地理解編程語言的原理,提高編程技能和開發(fā)效率。 AST還能做什么抽象語法樹(AST)在編程語言處理、軟件工程和開發(fā)工具中發(fā)揮著關(guān)鍵作用。除了前面討論過的用途之外,AST還可以用于以下方面:
這些僅是AST在計算機(jī)科學(xué)和軟件工程中的部分應(yīng)用。通過對AST進(jìn)行分析和操作,我們可以創(chuàng)建更高效、可靠和易于維護(hù)的軟件系統(tǒng)。 三、動態(tài)代碼分析技術(shù)和工具 動態(tài)代碼分析是一種軟件測試方法,通過在運行時執(zhí)行程序來檢測和評估代碼的行為和性能。它使用各種技術(shù)來捕獲程序執(zhí)行期間的數(shù)據(jù),包括函數(shù)調(diào)用、變量值、內(nèi)存使用、CPU利用率等。這些數(shù)據(jù)可以用來識別和修復(fù)程序中的錯誤、優(yōu)化程序性能以及改進(jìn)代碼質(zhì)量。 動態(tài)代碼分析可以幫助解決哪些問題? 漏洞檢測和修復(fù):動態(tài)代碼分析可以檢測代碼中的漏洞和安全問題,并提示開發(fā)人員進(jìn)行修復(fù),以提高應(yīng)用程序的安全性。 性能調(diào)優(yōu):動態(tài)代碼分析可以幫助開發(fā)人員找到應(yīng)用程序中的性能瓶頸,以便進(jìn)行優(yōu)化和提高應(yīng)用程序的性能。 檢測代碼錯誤:動態(tài)代碼分析可以檢測代碼中的語法錯誤、邏輯錯誤和其他錯誤,并提示開發(fā)人員進(jìn)行修復(fù),以提高應(yīng)用程序的質(zhì)量和穩(wěn)定性。 代碼覆蓋率分析:動態(tài)代碼分析可以幫助開發(fā)人員評估代碼的覆蓋率,以確定測試用例是否足夠全面,以便更好地測試應(yīng)用程序。 代碼質(zhì)量分析:動態(tài)代碼分析可以評估代碼的質(zhì)量,包括代碼結(jié)構(gòu)、可讀性、可維護(hù)性和可擴(kuò)展性等方面,以幫助開發(fā)人員改進(jìn)代碼質(zhì)量。 靜態(tài)代碼分析和動態(tài)代碼分析有何不同? 靜態(tài)代碼分析檢查代碼,以識別邏輯和技術(shù)中的問題。動態(tài)代碼分析則運行代碼和檢查結(jié)果,這還需要測試代碼可能存在的執(zhí)行路徑。 即使采用最基本的方式,當(dāng)開發(fā)團(tuán)隊測試代碼時,他們是在執(zhí)行動態(tài)分析。而當(dāng)程序員審查代碼時,則是在執(zhí)行靜態(tài)分析。無論使用哪種工具,開發(fā)人員和程序員都在執(zhí)行分析,最終有助于創(chuàng)建更好的代碼。 靜態(tài)代碼和動態(tài)代碼本身都不是理想的選擇,這意味著團(tuán)隊?wèi)?yīng)優(yōu)化兩者。開發(fā)團(tuán)隊不能將靜態(tài)代碼分析和動態(tài)代碼分析視為非此即彼的關(guān)系,而是應(yīng)將它們視為互補(bǔ)和共生的關(guān)系。 動態(tài)分析工具的優(yōu)勢 實時監(jiān)測:動態(tài)分析工具可以在代碼執(zhí)行時實時監(jiān)測和分析代碼的行為。它能夠捕捉到傳統(tǒng)靜態(tài)分析工具無法發(fā)現(xiàn)的問題,如運行時錯誤、性能瓶頸等。 精確定位:動態(tài)分析工具可以提供詳細(xì)的運行時數(shù)據(jù)和堆棧跟蹤,幫助開發(fā)人員精確定位問題所在。它可以減少開發(fā)人員的猜測和試錯成本,提高問題解決的效率。 可視化展示:動態(tài)分析工具通常提供直觀的可視化界面,將復(fù)雜的運行時數(shù)據(jù)以圖表、報告等形式展示出來。這有助于開發(fā)人員更直觀地理解代碼的行為和性能狀況。 自動化測試:動態(tài)分析工具可以與自動化測試框架結(jié)合使用,實現(xiàn)自動化的性能測試和錯誤調(diào)試。它可以在持續(xù)集成環(huán)境中自動運行,提高測試效率和質(zhì)量。 常見動態(tài)代碼分析工具 黑盒分析就是在沒有源代碼情況下進(jìn)行的分析,主要的分析技術(shù)是fuzz。其思想是對程序的輸入做任意二進(jìn)制層面的改變,從而嘗試遍歷各種可能的輸入,觀察程序輸出從而判定是否存在BUG。 FUZZ也是可以做改進(jìn)的,從而提升效率。 (1)基于語法的fuzz 基本思路是:縮小純隨機(jī)的部分,不要改變輸入中格式應(yīng)該固定的部分。比如一個處理音頻的程序,那么輸入中音頻文件固定的那些編碼就不用再fuzz了。因為讀文件時發(fā)現(xiàn)格式不對程序就會立即退出,所以測也沒意義。 (2)基于污點分析的fuzz 基本思路:如果我能知道輸入的哪幾位最終會影響輸出的話,fuzz就可以更有針對性。那么可以通過污點分析的方式分析輸入與輸出之間的關(guān)聯(lián),然后進(jìn)行針對性的fuzz。 常見FUZZ工具有:Spike,Bunny,teenage mutant ninja turtles,sulley等等 2、符號執(zhí)行 白盒分析在擁有源代碼的條件下進(jìn)行動態(tài)分析,通過模擬堆棧的方式執(zhí)行每一條opcode,嘗試遍歷所有的路徑。 但是,由于我們不可能遍歷所有的輸入,那么如何真正意義上達(dá)到遍歷所有路徑呢?答案就是符號執(zhí)行 符號執(zhí)行的概念其實非常簡單,對一個不確定的值,用一個符號來代表他。如果這個值用于分支語句,那么對分支的每一條路徑都增加一個該值的限制條件。當(dāng)路徑結(jié)束時,綜合所有的限制條件,我們就可以得到該變量的值域。 通過符號執(zhí)行的方法,我們就可以嘗試遍歷所有路徑。 (1)將輸入符號化 (2)在所有的分支處都執(zhí)行state的復(fù)制和分別執(zhí)行 這樣理論上就可能遍歷程序的所有分支。 3、代碼覆蓋率統(tǒng)計 jacoco Jacoco是一個開源的覆蓋率工具。Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技術(shù)監(jiān)控Java程序。很多第三方的工具提供了對Jacoco的集成,如Jenkins。 4、性能調(diào)優(yōu)的工具 1)命令行分析工具(Command-line profiling tools)
2)JConsole(GUI監(jiān)控工具) 3)Visual VM 4)MAT(Eclipse Memory Analyzer) 5、程序調(diào)試器 1)WinDbg WinDbg是Windows平臺上一款功能強(qiáng)大的調(diào)試器,它可以用于對本地或遠(yuǎn)程進(jìn)程進(jìn)行動態(tài)調(diào)試和分析。WinDbg支持多種調(diào)試功能,包括斷點設(shè)置、內(nèi)存監(jiān)控、寄存器查看等,可以用于動態(tài)分析代碼的執(zhí)行過程。 2)GDB GDB是一款開源的調(diào)試器,主要用于在Linux和UNIX系統(tǒng)上對程序進(jìn)行調(diào)試和動態(tài)分析。GDB支持多種處理器架構(gòu),并提供豐富的調(diào)試功能,可以幫助開發(fā)人員和安全專家在代碼執(zhí)行過程中進(jìn)行監(jiān)控和分析。 3)OllyDbg OllyDbg是一款Windows平臺上廣泛使用的動態(tài)調(diào)試器和逆向工程工具。它提供了強(qiáng)大的動態(tài)分析功能,包括斷點設(shè)置、內(nèi)存監(jiān)控、寄存器查看等,可以幫助逆向工程師深入分析代碼的執(zhí)行過程。 |
|