<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 11, comments - 10, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    靜態分析工具及使用總結(一)

    Posted on 2006-11-09 17:21 繁星滿空 閱讀(3170) 評論(0)  編輯  收藏 所屬分類: Java

    這里主要介紹三種開源的工具,PMDCheckStyleFindBugs,著重是在Ant里的調用,據說商業軟件JTest也是著名的代碼分析工具,哈哈,要花錢的沒有用過。

    ?

    PMD http://pmd.sourceforge.net/

    簡介: PMD 掃描java源代碼,查找潛在的問題,如:

    可能的bugs,如空的try/catch/finally/switch聲明

    死亡的代碼,沒有使用的本地變量,參數和私有方法

    不合標準的代碼,如String/StringBuffer用法

    過于復雜的表達式,如不必要的if表達式

    重復的代碼,拷貝、粘貼的代碼

    PMD 的含義,如

    Project Mess Detector

    Project Monitoring Directives

    Project Meets Deadline

    Programming Mistake Detector…

    ?

    用法: 可以在命令行下執行,如

    pmd c:\Test.java xml rulesets/unusedcode.xml

    也可以使用IDE的插件,如EclipseIDEAJBuilderJCreator等等

    這里主要介紹Ant里的調用,

    下面是主要的Ant配置信息
    <path?id="pmd.path">????
    ????
    <fileset?dir="${lib.dir}/pmd-3.8">
    ????????
    <include?name="**/*.jar"?/>
    ????
    </fileset>
    </path>
    <taskdef?name="pmd"?classname="net.sourceforge.pmd.ant.PMDTask"?classpathref="pmd.path"/>
    <taskdef?name="cpd"?classname="net.sourceforge.pmd.cpd.CPDTask"?classpathref="pmd.path"/>
    ????
    <target?name="pmd">
    ????????
    <pmd?shortFilenames="true">
    ????????????
    <ruleset>rulesets/favorites.xml</ruleset>????????????
    ????????????
    <formatter?type="html"?toFile="d:\foo.html"?toConsole="false"/>
    ????????????
    <fileset?dir="${src.dir}">
    ????????????????
    <include?name="**/*.java"/>
    ????????????
    </fileset>
    ????????
    </pmd>
    ????
    </target>
    <target?name="cpd">????????
    ????????
    <cpd?minimumTokenCount="100"?outputFile="d:/cpd.txt">
    ????????????
    <fileset?dir="${src.dir}">
    ????????????????
    <include?name="**/*.java"/>
    ????????????
    </fileset>
    ????????
    </cpd>
    ????
    </target>

    自定義規則:

    有兩個辦法來自定義規則,可以編寫java類和編寫XPath,編寫java類的一般步驟是,先確定要查找的代碼形式,利用PMD自帶的designer.bat工具查看AST(抽象語法樹),然后編寫規則類(繼承net.sourceforge.pmd.AbstractRule),然后編寫一個rulesetXML文件,最后就可以運行PMD進行檢查。編寫XPath比編寫java類要容易些,但也需要掌握AST的含義,利用designer.bat工具可以查看AST,比如 //ClassBody [count(//VariableDeclarator[../Type/Name[@Image='Logger']])>1] ,這個表達式就是查找類的代碼里是否聲明了多個 Logger ,然后編寫一個 ruleset XML 文件,最后運行 PMD 進行檢查。這里是一個 ruleset XML 文件的例子。

    ?

    自定義規則集合:

    PMD 自帶了很多代碼規范的規則,還可以自定義規則,我們可以把這些規則整合到一起,按照我們的需求進行代碼檢查。
    <!--?使用整個strings規則集?-->
    ??
    <rule?ref="rulesets/strings.xml"/>
    <!--?使用某個規則集里的某個規則?-->
    ??
    <rule?ref="rulesets/unusedcode.xml/UnusedLocalVariable"/>
    ??
    <!--?指定某個規則集里的某個規則的優先級?-->
    <rule?ref="rulesets/basic.xml/EmptyCatchBlock"?message="Must?handle?exceptions">
    ????
    <priority>2</priority>
    ????
    </rule>
    ??????????
    <!--?去除某個規則集里的某個規則?-->
    <rule?ref="rulesets/braces.xml">
    ????
    <exclude?name="WhileLoopsMustUseBracesRule"/>
    ??
    </rule>

    最后,我們運行PMD的時候就可以指定這個 ruleset 文件。

    ?

    自帶規則的介紹:

    PMD 自帶了很多規則集合,并且分類寫入不同的 ruleset 文件,如

    Basic 包含每人都必須遵守的代碼最佳實踐,如EmptyCatchBlock

    Braces 關于條件分支的規則,如IfStmtsMustUseBraces

    Code Size 關于代碼大小的規則,如方法的長度,參數的長度,屬性的個數等

    Clone 克隆實現的規則,如是否有super.clone()

    Controversial 一些有爭議的規則,如UnnecessaryConstructor不必要的構造器

    Coupling 對象連接有關的規則

    Design 可以檢查有問題的設計,如SwitchStmtsShouldHaveDefault

    Finalizers 使用finalizers時需遵循的規則,如FinalizeOnlyCallsSuperFinalize

    Import Statements import有關的規則,如DuplicateImports重復import

    J2EE 唯一規則UseProperClassLoaderclass.getClassLoader()可能不正確,用

    Thread.currentThread().getContextClassLoader() 代替

    Javabeans javabean規范有關的規則,有BeanMembersShouldSerialize屬性必須

    序列化和MissingSerialVersionUID缺少序列化ID

    JUnit Tests JUnit測試有關的,如JUnitSpelling拼寫檢查等

    Logging (Java) 檢查Logger的一些錯誤用法,如MoreThanOneLogger多個Logger

    Logging (Jakarta) 使用Jakarta Logger的一些規則,有UseCorrectExceptionLogging

    異常處理不當和ProperLogger是否正確定義Logger

    Migrating JDK 版本移植的規則,如ReplaceVectorWithListList代替Vector

    Naming 和命名有關的規則,名稱太短或太長,命名的約定等

    Optimizations 優化性能的一些規則,如LocalVariableCouldBeFinal本地變量如果

    只賦值一次,則應該聲明為final

    Strict Exceptions 比較嚴格的異常處理方針,如AvoidCatchingThrowable

    Strings 使用StringStringBuffer時應遵守的規則,如StringToString

    Sun Security 編寫安全的代碼,有MethodReturnsInternalArray直接返回內部的數組,

    更安全的做法是返回一個拷貝和ArrayIsStoredDirectly

    Unused Code 檢查未使用的代碼,如UnusedPrivateField未使用的私有屬性

    Java Server Pages 編寫jsp的一些方針,如NoLongScripts

    Java Server Faces 編寫jsf的一些方針,有DontNestJsfInJstlIteration,在Jsf

    里使用jstl的標簽

    PMD 里面還有一個寫好的ruleset文件,在pmd-3.8.jar里面的rulesets文件夾下,名稱是favorites.xml,以下是主要部分:

    < rule? ref ="rulesets/basic.xml" />
    < rule? ref ="rulesets/basic.xml/EmptyCatchBlock" ?message ="Must?handle?exceptions" >
    ????????
    < priority > 2 </ priority >
    </ rule >
    ????
    < rule? ref ="rulesets/unusedcode.xml" />
    < rule? ref ="rulesets/braces.xml/WhileLoopsMustUseBraces" />
    < rule? ref ="rulesets/braces.xml/ForLoopsMustUseBraces" />
    < rule? ref ="rulesets/design.xml/SimplifyBooleanReturns" />
    < rule? ref ="rulesets/design.xml/SwitchStmtsShouldHaveDefault" />
    < rule? ref ="rulesets/strings.xml/StringToString" />
    < rule? ref ="rulesets/strings.xml/StringInstantiation" />
    < rule? ref ="rulesets/controversial.xml/UnnecessaryConstructor" />
    < rule? ref ="rulesets/controversial.xml/NullAssignment" />
    < rule? ref ="rulesets/controversial.xml/UnusedModifier" />
    < rule? ref ="rulesets/codesize.xml/CyclomaticComplexity" >
    ????
    < properties >< property? name ="reportLevel" ?value ="5" /></ properties >
    </ rule >

    其它事項:

    1.???? 可以使用JDK1.5的聲明 @SuppressWarnings(""),禁止PMD的警告。

    2.???? 可以使用//NOPMD來標記行或塊代碼,禁止PMD警告。

    3.???? 有兩種方法自定義Rule,編寫java類和編寫XPath

    4.???? PMD 提供了多種IDE的插件來運行PMD

    ?

    ?

    ?

    參考文檔:

    PMD 官方文檔(http://pmd.sourceforge.net/

    OnJava 上一篇文檔( http://www.onjava.com/pub/a/onjava/2003/04/09/pmd_rules.html

    代碼靜態分析(http://blog.donews.com/foxgem/archive/2005/04/23/347444.aspx

    ?

    主站蜘蛛池模板: 免费看美女让人桶尿口| 无码午夜成人1000部免费视频| 成年黄网站色大免费全看| 亚洲精品乱码久久久久久中文字幕 | 国产福利电影一区二区三区,亚洲国模精品一区| 亚洲乱码在线观看| 在线观看免费人成视频| 在线观看亚洲AV日韩A∨| 在线观看免费人成视频色9| 亚洲日本VA中文字幕久久道具| 在线视频免费观看www动漫| 亚洲aⅴ无码专区在线观看| 国产青草视频在线观看免费影院| 亚洲精华国产精华精华液网站| 免费看又爽又黄禁片视频1000| 337p日本欧洲亚洲大胆人人 | 永久免费视频网站在线观看| 亚洲另类春色国产精品| 午夜电影免费观看| 污污视频网站免费观看| 亚洲精品无码专区在线在线播放| 国产午夜无码精品免费看动漫| 亚洲黄色在线观看视频| 成人超污免费网站在线看| 特级毛片免费观看视频| 亚洲人成亚洲人成在线观看| 91福利免费视频| 亚洲日韩国产一区二区三区在线 | 亚洲人成电影在线天堂| 在线观看日本免费a∨视频| 日韩免费码中文在线观看| 久久被窝电影亚洲爽爽爽| 91在线视频免费看| 免费无码专区毛片高潮喷水| 久久精品视频亚洲| 卡1卡2卡3卡4卡5免费视频| 91视频精品全国免费观看| 亚洲欧洲中文日产| 免费大片在线观看网站| 暖暖免费在线中文日本| 亚洲国产av玩弄放荡人妇|