<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 繁星滿空 閱讀(3169) 評論(0)  編輯  收藏 所屬分類: Java

    這里主要介紹三種開源的工具,PMD、CheckStyleFindBugs,著重是在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的插件,如Eclipse、IDEA、JBuilder、JCreator等等

    這里主要介紹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 唯一規則UseProperClassLoader,class.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

    ?

    主站蜘蛛池模板: 日本一区二区在线免费观看| 久久精品国产96精品亚洲| 色偷偷亚洲女人天堂观看欧| 欧洲人成在线免费| 亚洲今日精彩视频| 99re热精品视频国产免费| 久久久久亚洲AV成人无码网站| 免费人成网站在线观看不卡| 久久综合图区亚洲综合图区| 一区二区在线免费观看| 亚洲天堂中文资源| 18禁网站免费无遮挡无码中文| 亚洲福利视频网址| 成人在线免费观看| 亚洲变态另类一区二区三区| 免费国产人做人视频在线观看| 无码 免费 国产在线观看91| 自拍偷自拍亚洲精品情侣| 久久精品国产这里是免费| 亚洲精品在线不卡| 成年女人色毛片免费看| 在线观看免费亚洲| 丝袜熟女国偷自产中文字幕亚洲| 视频免费在线观看| 亚洲伊人久久大香线焦| 日韩高清在线免费观看| 羞羞视频免费网站在线看| 亚洲国产精品不卡在线电影| 最近的免费中文字幕视频| 精品特级一级毛片免费观看| 亚洲色精品vr一区二区三区| 4虎永免费最新永久免费地址| 亚洲1区2区3区精华液| 亚洲综合av永久无码精品一区二区| 日本一道本不卡免费| 亚洲综合精品第一页| 亚洲综合精品香蕉久久网| 免费视频专区一国产盗摄| 一级成人a免费视频| 亚洲高清免费在线观看| 国产在线不卡免费播放|