2023-07-04 10:20:41來源:今日頭條
靜態(tài)測試包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量等。它可以由人工進(jìn)行,充分發(fā)揮人的邏輯思維優(yōu)勢,也可以借助軟件工具自動進(jìn)行。
(資料圖片僅供參考)
代碼檢查包括代碼走查、桌面檢查、代碼審查等,主要檢查代碼和設(shè)計(jì)的一致性,代碼對標(biāo)準(zhǔn)的遵循、可讀性,代碼的邏輯表達(dá)的正確性,代碼結(jié)構(gòu)的合理性等方面;可以發(fā)現(xiàn)違背程序編寫標(biāo)準(zhǔn)的問題,程序中不安全、不明確和模糊的部分,找出程序中不可移植部分、違背程序編程風(fēng)格的問題,包括變量檢查、命名和類型審查、程序邏輯審查、程序語法檢查和程序結(jié)構(gòu)檢查等內(nèi)容。
看了一系列的靜態(tài)代碼掃描或者叫靜態(tài)代碼分析工具后,總結(jié)對工具的看法:靜態(tài)代碼掃描工具,和編譯器的某些功能其實(shí)是很相似的,他們也需要詞法分析,語法分析,語意分析...,但和編譯器不一樣的是他們可以自定義各種各樣的復(fù)雜的規(guī)則去對代碼進(jìn)行分析。
二、靜態(tài)代碼檢查工具1、PMDPMD是一個代碼檢查工具,它用于分析Java源代碼,找出潛在的問題:
潛在的bug:空的try/catch/finally/switch語句未使用的代碼:未使用的局部變量、參數(shù)、私有方法等可選的代碼:String/StringBuffer的濫用復(fù)雜的表達(dá)式:不必須的if語句、可以使用while循環(huán)完成的for循環(huán)重復(fù)的代碼:拷貝/粘貼代碼意味著拷貝/粘貼bugsPMD特點(diǎn)
與其他分析工具不同的是,PMD通過靜態(tài)分析獲知代碼錯誤。也就是說,在不運(yùn)行Java程序的情況下報(bào)告錯誤。PMD附帶了許多可以直接使用的規(guī)則,利用這些規(guī)則可以找出Java源程序的許多問題用戶還可以自己定義規(guī)則,檢查Java代碼是否符合某些特定的編碼規(guī)范。同時,PMD已經(jīng)與JDeveloper、Eclipse、jEdit、JBuilder、BlueJ、CodeGuide、NetBeans、Sun JavaStudio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant、Gel、JCreator以及Emacs集成在一起。PMD規(guī)則是可以定制的: 可用的規(guī)則并不僅限于內(nèi)置規(guī)則。您可以添加新規(guī)則:可以通過編寫Java代碼并重新編譯PDM,或者更簡單些,編寫XPath表達(dá)式,它會針對每個Java類的抽象語法樹進(jìn)行處理。只使用PDM內(nèi)置規(guī)則,PMD也可以找到你代碼中的一些真正問題。某些問題可能很小,但有些問題則可能很大。PMD不可能找到每個bug,你仍然需要做單元測試和接受測試,在查找已知bug時,即使是PMD也無法替代一個好的調(diào)試器。但是,PMD確實(shí)可以幫助你發(fā)現(xiàn)未知的問題。2、FindBugsFindBugs是一個開源的靜態(tài)代碼分析工具,基于LGPL開源協(xié)議,無需運(yùn)行就能對代碼進(jìn)行分析的工具。不注重style及format,注重檢測真正的bug及潛在的性能問題,尤其注意了盡可能抑制誤檢測(false positives)的發(fā)生。以bytecode(*.class、*.jar)為對象進(jìn)行檢查。除了單獨(dú)動作,還可以用作Eclipse 的plug-in,以及嵌入Ant作為task之一 進(jìn)行利用。
findbugs自帶檢測器的介紹: findbugs自帶60余種Bad practice,80余種Correntness,1種Internationalization,12種Malicious code vulnerability,27種Multithreaded correntness,23種Performance,43種Dodgy。
Findbugs的一些特點(diǎn):
FindBugs主要著眼于尋找代碼中的缺陷,這就與其他類似工具有些區(qū)別了,直接操作類文件(class文件)而不是源代碼。FindBugs可以通過命令行、各種構(gòu)建工具(如Ant、Maven等)、獨(dú)立的Swing GUI或是以Eclipse和NetBeans IDE插件的方式來運(yùn)行。FindBugs輸出結(jié)果既可以是XML的,也可以是文本形式的。開發(fā)者可以通過多種方式來使用FindBugs,最常見的是在新編寫模塊的代碼分析以及對現(xiàn)有代碼進(jìn)行更大范圍的分析。不注重style及format,注重檢測真正的bug及潛在的性能問題,尤其注意了盡可能抑制誤檢測(false positives)的發(fā)生。FindBugs可檢測的bug pattern舉例:檢測java programing中容易陷入的bug pattern,equals() 實(shí)現(xiàn)時的一般規(guī)約違反Null pointer的參照 ,Method的返回值的check遺漏 ,初始化前field的訪問,Multi-thread的正確性, 同期化處理的矛盾, 無條件的wait(), Code的脆弱性 ,可以變更的靜態(tài)object ,內(nèi)部數(shù)列參照的return等3、Checkstyle定義:Checkstyle是一款檢查Java程序源代碼樣式的工具。
特點(diǎn):
它可以有效的幫助我們監(jiān)視代碼,以便更好的遵循代碼編寫標(biāo)準(zhǔn),特別適用于小組開發(fā)時彼此間的樣式規(guī)范和統(tǒng)一。Checkstyle提供了高可配置性,以便適用于各種代碼規(guī)范,所以除了使用它提供的幾種常見標(biāo)準(zhǔn)之外,你也可以定制自己的標(biāo)準(zhǔn)。Checkstyle提供了支持大多數(shù)常見IDE的插件,大部分插件中就含有最新的Checkstyle,就不用費(fèi)心再部署一份了。Checkstyle可以檢查代碼的很多方面,從傳統(tǒng)觀點(diǎn)看,它主要是用來檢查代碼層面的,自從第三版以后,它的內(nèi)部架構(gòu)作了重大改變,很多其它意圖的檢測加了進(jìn)來,現(xiàn)在Checkstyle可以檢查像類設(shè)計(jì)的問題,重復(fù)代碼,如鎖的雙重檢查的bug模式。CheckStyle的主要流程是:
對Java文件進(jìn)行詞法語法分析,生成語法樹。載入配置文件(checkstyle-metadata.xml以及自定義的配置文件)register check事件。按照深度優(yōu)先遍歷對語法樹進(jìn)行解析,按照注冊的事件,在到達(dá)某些節(jié)點(diǎn)( AST ) 時進(jìn)行style檢查(AST,A child-Sibling Tree,是語法樹中的某個節(jié)點(diǎn),其類型在TokenTypes類中定義。)我們所說的自定義Style的檢查,就是在第二步設(shè)定的。這里牽涉到一個叫com.puppycrawl.tools.checkstyle.api.Check 的類,我們通常需要重載其中的兩個函數(shù): public int[] getDefaultTokens()和public void visitToken(DetailAST ast)。 這兩個函數(shù)的含義為,在遍歷語法樹的過程中,每當(dāng)?shù)竭_(dá)getDefaultTokens函數(shù)所返回的AST類型,程序就進(jìn)入visitToken進(jìn)行具體的檢查和分析,即,真正的分析檢查過程是在visitToken中實(shí)現(xiàn)的。4、Hammurapi定義:Hammurapi它是一個開源的代碼審查/評審(review)工具。它可以幫助改進(jìn)Java代碼的質(zhì)量。它可以基于一套設(shè)計(jì)規(guī)范來分析代碼庫。當(dāng)它碰到違反規(guī)范的地方,會在報(bào)告中標(biāo)識。就像Checkstyle一樣,它與Ant無縫集成并且由基于XML配置文件來驅(qū)動。
特點(diǎn):
Hammurapi是用來強(qiáng)制代碼設(shè)計(jì)規(guī)范的。Hammurapi是一個遵循設(shè)計(jì)的工具,提供了自動而且一致的方式來實(shí)現(xiàn)設(shè)計(jì)規(guī)范,因此使代碼評審更加有效而輕松。Hammurapi如何工作:Hammurapi這樣的代碼分析工具都帶有語言分析器。語言分析器是一種輸入語言代碼并輸出抽象語法樹的工具。這個樹上的節(jié)點(diǎn)代表語言標(biāo)識。例如,考慮一下簡單的算術(shù)表達(dá)式:3+4. 語言分析器會解析他成為一個如圖5所示的語法樹。在這個樹中,節(jié)點(diǎn)+代表操作符標(biāo)識。節(jié)點(diǎn)3和4是操作數(shù)標(biāo)識Hammurapi使用ANTLR(另一個語言識別工具)作為語言分析器。然而ANTLR API是相當(dāng)?shù)讓拥?。為改善可用性,Hammurapi使用另一個API,基于ANTLR 的JSEL(Java源程序工程類庫),來訪問抽象語法樹。 一旦樹構(gòu)建完成,一種樹遍歷算法就被用來訪問樹中每一個節(jié)點(diǎn)。每次訪問到一個節(jié)點(diǎn),一種回調(diào)機(jī)制(Visitor模式)被用來提示相應(yīng)的檢查器。在這些回調(diào)方法中,檢查器收集相關(guān)的信息來確定是否有違反規(guī)范的地方存在。5、Lint4j定義:Lint4J是一個針對Java的源代碼分析工具,它可以對Java源碼和字節(jié)碼進(jìn)行靜態(tài)分析,判斷其中是否存在死鎖、性能問題或者伸縮性問題。它可以集成到任何IDE種或構(gòu)建系統(tǒng)
特點(diǎn):
檢測代碼語法規(guī)則潛在的bug檢測編碼模式對代碼可讀性及大小的影響檢測是否違反EJB規(guī)范6、Sonar定義:代碼質(zhì)量管理工具Sonar提供了設(shè)計(jì)與架構(gòu)度量。Sonar 2.0引入了針對Java應(yīng)用的設(shè)計(jì)分析、架構(gòu)與面向?qū)ο蟮亩攘?,Sonar 2.1可以檢測到未使用的方法以及對不建議使用方法的調(diào)用。是一個集成了CheckStyle、PMD、Findbugs的代碼校驗(yàn)規(guī)則,重復(fù)代碼發(fā)現(xiàn),代碼測試覆蓋率,代碼注釋率,及所有的檢測率變化追蹤的完美代碼質(zhì)量檢查工具。它包含了代碼質(zhì)量檢測的七個方面
特點(diǎn):
代碼覆蓋:通過單元測試,將會顯示哪行代碼被選中。改善編碼規(guī)則。搜尋編碼規(guī)則:按照名字,插件,激活級別和類別進(jìn)行查詢。項(xiàng)目搜尋:按照項(xiàng)目的名字進(jìn)行查詢。對比數(shù)據(jù):比較同一張表中的任何測量的趨勢。單元測試Sonar2.1:
Sonar還基于Squid引入了一個全新的規(guī)則引擎、Sonar解析器既可以處理源代碼,也可以處理字節(jié)碼,解析器帶有內(nèi)建的規(guī)則,可以檢測未使用的私有與保護(hù)方法以及客戶端對不建議使用的方法的調(diào)用。Squid通過分析應(yīng)用源代碼、Java API和外部程序庫的字節(jié)碼來決定哪些方法、類和屬性是不建議使用的。Sonar 2.1的新特性:
一個全新的“Libraries”頁面,顯示了項(xiàng)目中所有的程序庫和依賴,該特性要求使用Maven來構(gòu)建項(xiàng)目。一旦在Sonar站點(diǎn)的主頁上選擇了一個項(xiàng)目,該服務(wù)就會以可視化的樹形結(jié)構(gòu)展示出項(xiàng)目依賴。此外,還有一個可選的動態(tài)過濾器,可以根據(jù)名稱過濾程序庫以便在應(yīng)用的依賴間導(dǎo)航。用于搜索程序庫使用情況的“Dependencies”頁面。比如說,可以搜索到使用了第三方框架如Commons Logging 1.1的所有項(xiàng)目??梢允褂酶鞣N插件擴(kuò)展Sonar的功能?,F(xiàn)在有一個全新的“System Info”頁面顯示了系統(tǒng)屬性、已裝插件和Java虛擬機(jī)內(nèi)存統(tǒng)計(jì)信息。該頁面還給出了關(guān)于Sonar配置和數(shù)據(jù)庫統(tǒng)計(jì)的詳細(xì)信息。一個用于管理已裝插件和系統(tǒng)信息的管理控制臺。最新版的Sonar為這些插件引入了一個測試框架和一個客戶化的Maven生命周期管理工具。它還帶有一個用于集成項(xiàng)目事件的Web Service并在項(xiàng)目的size widget中增加了一個新的度量模塊。7、JDependJDepend一個開放源代碼的可以用來評價Java程序質(zhì)量的優(yōu)秀工具,它遍歷Java class的文件目錄,以Java包(package)為單位,為每一個包/類自動生成 包的依賴程度,穩(wěn)定性,可靠度等的評價報(bào)告,根據(jù)這些報(bào)告,我們可以得到包或類之間的依賴關(guān)系,并分析出包的穩(wěn)定程度,抽象程度,是否存在循環(huán)依耐關(guān)系等 ??梢愿鶕?jù)JDepend給出的報(bào)告數(shù)據(jù),分析出我們的包是否是可靠的,穩(wěn)定的,健壯的包,是否符合面向?qū)ο蟮脑O(shè)計(jì)原則。
特點(diǎn):
評價設(shè)計(jì)質(zhì)量翻轉(zhuǎn)依賴性支持并行開發(fā)和極限編程獨(dú)立的發(fā)布模塊識別package的循環(huán)依賴Depend生成的Java包的質(zhì)量評價報(bào)告主要包括:
Number of Classes and Interfaces:實(shí)現(xiàn)類與抽象接口的數(shù)目Abstractness (A):包的抽象度。指一個包內(nèi)包含的抽象類或接口占整個包中的類的比重。Afferent Couplings (Ca):向心耦合。依賴該包(包含的類)的外部包(類)的數(shù)目(i.e. incoming dependencies),該數(shù)值越大,說明該包的擔(dān)當(dāng)?shù)穆氊?zé)越大,也就越穩(wěn)定。Efferent Couplings (Ce):離心耦合。被該包依賴的外部包的數(shù)目(i.e. outgoing dependencies),該數(shù)值越大, 說明該包越不獨(dú)立(因?yàn)橐蕾嚵藙e的包),也越不穩(wěn)定。Instability (I):衡量一個包的不穩(wěn)定程度。I=Ce/(Ce+Ca)。它的值處于[0,1]之間。I=0時說明包是最穩(wěn)定的,反之I=1則說明包極不穩(wěn)定。Distance from the Main Sequence (D): 該指標(biāo)主要用來評價包的抽象程度與穩(wěn)定程度的平衡關(guān)系,它可以用二維直線圖 A + I = 1 來表示。Package Dependency Cycles:包的循環(huán)依賴度。8、IBM Checking Tool for Bugs Errors and Mistakes(簡稱BEAM)定義:是 IBM 開發(fā)的一個靜態(tài)分析工具,可以用于分析并查找出 C, C++ 和 Java代碼中的一些不容易發(fā)現(xiàn)的潛在錯誤,從而達(dá)到提高代碼質(zhì)量的目的。同動態(tài)分析工具和其它靜態(tài)分析工具相比,它擁有一些可貴的特性。
特點(diǎn):
對代碼進(jìn)行語法掃描,通過算法對代碼進(jìn)行檢查分析。和一些 bug 模式進(jìn)行比較,最終標(biāo)明問題區(qū)域,輸出分析結(jié)果。使用了額外的定理證明(theorem proving)技術(shù)來判斷一個潛在的錯誤是否是真正的錯誤,從而減輕了程序員判斷錯誤真?zhèn)嗡璧墓ぷ髁俊?、LDRA Testbed定義:LDRA Testbed為應(yīng)用軟件的確認(rèn)和驗(yàn)證提供強(qiáng)大的源代碼測試和分析功能,是獨(dú)特的質(zhì)量控制工具。 它有助于提高計(jì)算機(jī)軟件必需的可靠性,健壯性和盡可能的零缺陷,它的使用帶來時間、成本和效率上真實(shí)的節(jié)省,這些都是無法衡量其價值的。它是強(qiáng)大和完整的集成工具包,使先進(jìn)的軟件分析技術(shù)應(yīng)用在開發(fā)生命周期的關(guān)鍵階段。
LDRA Testbed提供強(qiáng)大的分析功能,用于兩個主要的測試領(lǐng)域,靜態(tài)分析和動態(tài)分析。
靜態(tài)分析: 分析代碼,并且提供對代碼結(jié)構(gòu)的理解。動態(tài)分析: 利用源代碼的插裝版本,使用測試數(shù)據(jù)執(zhí)行,在運(yùn)行時發(fā)現(xiàn)軟件缺陷使用LDRA testbed 的好處軟件開發(fā)和測試過程的成本效率分析工具單元、集成和系統(tǒng)測試的理想工具貫穿于軟件開發(fā)的整個生命周期LDRA Testbed應(yīng)用于許多不同的領(lǐng)域過程改進(jìn)軟件測試軟件維護(hù)
LDRA Testbed的優(yōu)點(diǎn):
改進(jìn)軟件質(zhì)量定位軟件缺陷強(qiáng)制執(zhí)行工業(yè)標(biāo)準(zhǔn)減少維護(hù)費(fèi)用40%以上減少開發(fā)和測試成本75%以上通過自動化過程提高員工動力10、Yasca定義:Yasca是一個開源靜態(tài)代碼分析工具插件框架, 集成流行的多語言靜態(tài)分析工具如findbugs/pmd/jlint/rats/cppcheck,由于插件本身多樣故可支持java c++等語言靜態(tài)分析.Yasca是一個用來尋找安全漏洞,在程序的源代碼中檢測代碼質(zhì)量、性能以及一致性的軟件。它集成了其他開源項(xiàng)目,其中包括FindBugs PMD ,JLint , Cppcheck ,并掃描某些文件類型,以及自定義掃描書面的Yasca 這是一個命令行工具,與報(bào)告中生成的HTML , CSV格式, XML,SQLite ,和其他格式。
關(guān)鍵詞:
靜態(tài)測試簡介靜態(tài)測試包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量等。它
7月4日消息,社交媒體平臺Instagram母公司Meta開發(fā)的推特競品Threads已
2023年初,由OpenAI開發(fā)的ChatGPT的橫空出世打破了互聯(lián)網(wǎng)行業(yè)微妙的平
在今天的NBA猶他夏聯(lián)中,76人92-94不敵灰熊。與76人簽下雙向合同的落選
近日,國家醫(yī)保局公布《2023年國家基本醫(yī)療保險(xiǎn)、工傷保險(xiǎn)和生育保險(xiǎn)藥
科技日報(bào)北京7月3日電(記者張夢然)發(fā)表在最新一期《柳葉刀》雜志的新
每經(jīng)AI快訊,圓明園獸首7月4日至8月31日在香港展出。此次文物展展出清
1、夢見教室,代表的是你個人的學(xué)習(xí)情況。2、夢中的教室,說明在你心中
hello大家好,我是城鄉(xiāng)經(jīng)濟(jì)網(wǎng)小晟來為大家解答以上問題,深圳網(wǎng)上交通
原標(biāo)題:標(biāo)價9 9元的衣服,點(diǎn)進(jìn)去才發(fā)現(xiàn)9 9元賣的只是衣服上的一個小配
來為大家解答以下的問題,蟹男和摩羯女睡過后,巨蟹男和摩羯女這個很多
來為大家解答以上問題,pdf,towordconverter很多人還不知道,現(xiàn)在讓我
hello大家好,我是大學(xué)網(wǎng)網(wǎng)小航來為大家解答以上問題,nba,魔術(shù)師約翰
中國報(bào)告大廳2023年7月3日廣東省三氯乙烯價格最新走勢監(jiān)測顯示:廣州市
黃梅時節(jié)家家雨,對虹口仁德小區(qū)76歲的獨(dú)居老人鐘阿姨來說,今年的黃梅