<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

    ?

    主站蜘蛛池模板: 亚洲日产乱码一二三区别| 精品日韩亚洲AV无码一区二区三区| 114一级毛片免费| 四虎在线免费视频| 成年女人毛片免费观看97| 国产一区二区三区在线免费| 国产成人精品久久亚洲高清不卡 | 亚洲成AV人片一区二区密柚| 亚洲网站在线观看| 亚洲heyzo专区无码综合| 国产福利免费视频| 国产免费阿v精品视频网址| 1000部拍拍拍18免费网站| 亚洲国产高清美女在线观看| 国产成人精品日本亚洲语音| 免费看搞黄视频网站| 午夜爱爱免费视频| 亚洲AV人人澡人人爽人人夜夜| 亚洲AV无码成人精品区狼人影院| 美女视频黄a视频全免费网站色窝| 国产亚洲AV无码AV男人的天堂| 亚洲一区二区三区高清不卡 | 91老湿机福利免费体验| 国产一级大片免费看| 一级特黄a免费大片| 全免费A级毛片免费看网站 | 亚洲国产综合精品| 在线免费一区二区| 黄色网页免费观看| 性感美女视频在线观看免费精品| 亚洲精品乱码久久久久蜜桃 | 免费大片黄手机在线观看| 亚洲人和日本人jizz| 99国产精品免费观看视频| 亚洲色大成网站WWW久久九九| 成a人片亚洲日本久久| 亚洲色偷拍另类无码专区| 国产精品色拉拉免费看| 美女被免费视频网站| 亚洲va在线va天堂va四虎| 拔擦拔擦8x华人免费久久|