Sonarqube JAVA自定義規(guī)則開發(fā)-XPATH模式

1版本說明

名稱 版本 說明
PMD 5.4.1 designer.bat
SONARQUBE 5.6 Sonarqube平臺版本
pmd-plugin 2.6 Pmd插件版本

2模板介紹

2.1簡述

注意:創(chuàng)建自定義規(guī)則需要登陸系統(tǒng)

Sonarqube平臺提供了一些模板來快速的實現(xiàn)一些簡單的自定義規(guī)則需求浪谴。JAVA所有的模板如下圖所示(DEPRECATED表示為廢棄的,不建議使用):

image.png

點擊某一個模板课锌,就可以進入該模板的說明頁纵朋,在該頁選擇“創(chuàng)建”柿顶,就可以創(chuàng)建自己的規(guī)則了。

image.png

下面對各個模板進行簡要說明:

2.2模板Custom resources should be closed

該模版主要實現(xiàn)了自定義資源是否關(guān)閉的檢查操软,防止內(nèi)存泄漏嘁锯。

需要提供的參數(shù):factoryMethod****,****closingMethod****,****constructor****家乘,****openingMethod

2.3模板Track breaches of architectural constraints

該模版主要實現(xiàn)了類之間引用的檢查蝗羊。

需要提供的參數(shù):fromClasses****(可選),****toClasses

例如: toClass設置為java.util.**仁锯,fromClass不設置耀找,那么在任何類中使用如下代碼將會違規(guī)

MapdispatcherConfig; //違規(guī)

PS:該模板后續(xù)將會廢棄,不建議使用业崖。經(jīng)測試野芒,toClass只對JDK類有效

2.4模板Track comments matching a regularexpression

該模板主要實現(xiàn)了注釋內(nèi)容的檢查。

需要提供的參數(shù):regularExpression,message

regularExpression代表正則表達式双炕,message表示輸出的錯誤信息

例如:regularExpression輸入.TODO.狞悲,那么所有包含TODO的注釋將報違規(guī)

2.5模板Track uses of disallowed classes

該模板主要實現(xiàn)了不允許使用的類的檢查。

需要提供的參數(shù):className****妇斤,類名摇锋,也可用正則表達式來實現(xiàn)包的禁止

例如:Classname****:java.lang.String,那么String name則會報違規(guī)

PS:經(jīng)測試站超,該模板只適合JDK的類

2.6模板Track uses of disallowed dependencies

該模板主要實現(xiàn)了不允許使用的依賴的檢查荸恕,主要檢查MAVEN的POM.xml文件。

需要提供的參數(shù):dependencyName****死相,****version

例如:With a parameterof: :.log4j.*

<dependency>

? <groupId>log4j</groupId>

? <artifactId>log4j</artifactId>

? <version>1.2.17</version>

</dependency>//違規(guī)

PS:目前不支持maven的POM.XML的分析融求,分析XML需要XML插件的支持,并且在工程中設置sonar.import_unknown_files"to "true"媳纬。

2.7模板Track uses of disallowed methods

該模板主要實現(xiàn)了不允許使用的方法的檢查双肤。

需要提供的參數(shù):methodName施掏,className****钮惠,****argumentTypes****,****allOverloads

例如:

className:java.lang.String

methodName:replace

argumentTypes:java.lang.CharSequence, java.lang.CharSequence

String name;

name.replace("A","a"); // 違規(guī)

PS:經(jīng)測試七芭,該模板只適合JDK的類

2.8模板XPath rule template

? 該模板是PMD插件提供的一個模板素挽,與之前的模板不一樣,之前的模板為sonar Java插件提供狸驳。因此预明,該模板的使用要依賴于PMD工具。

因為代碼掃描是依賴AST樹形結(jié)構(gòu)的耙箍,所以Xpath模式也就是通過PMD獲取樹的節(jié)點撰糠,再自定義規(guī)則進行匹配。

該模板主要實現(xiàn)了當java文件的AST樹與Xpath定義的規(guī)則匹配時辩昆,就報相應的違規(guī)阅酪。

因為該模板由PMD提供,sonarqube建議使用插件開發(fā)模式,因此該模板標示為: DEPRECATED,但仍然可以使用术辐。

下面詳細介紹Xpath模式的開發(fā)過程砚尽。

2.8.1開發(fā)過程

開始開發(fā)之前可以導入PMD源碼到Eclipse中,在pmd-java項目下找到rulesets文件夾辉词,底下全部是Java對應的PMD規(guī)則必孤,可以用來學習和參考。

image.png

以下以teller9的不允許使用GlobalCache來演示實現(xiàn)XPATH的完整過程瑞躺。

1敷搪、規(guī)則分析:

違規(guī)使用平臺內(nèi)部的執(zhí)行緩存

例1:

Map<String,Object>map = (Map<String,Object>)GlobalCache.getInstance().getCacheData();

例2:

GlobalCache.getInstance().setCacheData(map);

推薦的使用方式

無,不允許項目中使用GlobalCache存放數(shù)據(jù)

按照以上規(guī)則說明幢哨,可以看出购啄,當用Xpath rule template來實現(xiàn)這個規(guī)則時,需要能夠匹配到setCacheData方法嘱么,并且map變量名一致狮含。

2、使用PMD工具解析java文件

打開pmd/bin/designer.bat曼振,在Source code中輸入錯誤樣例几迄,點擊Go,AST一欄出現(xiàn)了PMD解析出來的java文件的AST樹冰评,該樹是我們進行后續(xù)開發(fā)的基礎映胁。

image.png

3、寫出XPATH規(guī)則

現(xiàn)在就可以寫對應的Xpath查詢了甲雅。Xpath要實現(xiàn)與違規(guī)的情景匹配解孙,與正確的寫法不匹配的基本目標。具體的Xpath方法可以查閱附錄資料抛人。

在Xpath Query輸入對應的查詢弛姜,點擊Go,就可以進行調(diào)試妖枚。當在右下角的框中出現(xiàn)了ASTblock Statement at line xxx 語句廷臼,這就說明PMD表達式成功了,可以從左側(cè)源碼中匹配到了符合觸發(fā)條件的代碼绝页。這時檢查行數(shù)是否在應該觸發(fā)違規(guī)的代碼處荠商。

當違規(guī)的情況驗證后,再輸入正確的source code续誉,再次執(zhí)行查詢莱没,此時右下角框中應該顯示:No matching code xxxx。

image.png

4酷鸦、創(chuàng)建自定義規(guī)則

建立成功PMD規(guī)則后饰躲,打開Sonarqube主頁朴译。點擊菜單欄的代碼規(guī)則,選擇Java属铁,選擇模板眠寿,只顯示模板,點擊右側(cè)的XPathrule template焦蘑,列出Xpath模板詳情盯拱。點擊創(chuàng)建,在彈出框中依次輸入名稱例嘱、關(guān)鍵字狡逢、描述,再選擇嚴重級別拼卵、狀態(tài)奢浑,最后在xpath文本框中輸入

//Block/BlockStatement[1]

[

.//PrimaryPrefix/Name[@Image='GlobalCache.getInstance']

and

(

ancestor::Block/BlockStatement[

? Statement/StatementExpression/PrimaryExpression

? [./PrimarySuffix[ends-with(@Image,"setCacheData")]]

?

]

)

]

這個PMD規(guī)則,點擊創(chuàng)建腋腮,保存成功即可雀彼。

? 5、執(zhí)行規(guī)則

在Sonarqube界面的質(zhì)量配置中新建“Java自定義規(guī)則”的質(zhì)量集合并設置為默認配置即寡,再次進入PMD模板頁面徊哑,點擊“不允許使用GlobalCache”進入詳情頁,點擊下面的活動按鈕聪富,將這個規(guī)則放到“Java自定義規(guī)則”下面莺丑。

輸入cmd進入命令行模式,進入需要調(diào)試的工程目錄墩蔓。比如梢莽,C:\work\manage>,輸入sonar-scanner進行代碼掃描奸披。待掃描結(jié)束后昏名,可以在Sonarqube界面查看bug情況。

2.8.2 參考

相關(guān)資料:

http://pmd.sourceforge.net/pmd-5.4.1/customizing/xpathruletutorial.html

http://www.w3school.com.cn/xpath/index.asp

PMD源碼主分支

https://github.com/SonarQubeCommunity/sonar-pmd

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末源内,一起剝皮案震驚了整個濱河市葡粒,隨后出現(xiàn)的幾起案子份殿,更是在濱河造成了極大的恐慌膜钓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卿嘲,死亡現(xiàn)場離奇詭異颂斜,居然都是意外死亡,警方通過查閱死者的電腦和手機拾枣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門沃疮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盒让,“玉大人,你說我怎么就攤上這事司蔬∫厍眩” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵俊啼,是天一觀的道長肺缕。 經(jīng)常有香客問我,道長授帕,這世上最難降的妖魔是什么同木? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮跛十,結(jié)果婚禮上彤路,老公的妹妹穿的比我還像新娘。我一直安慰自己芥映,他們只是感情好洲尊,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奈偏,像睡著了一般颊郎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霎苗,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天姆吭,我揣著相機與錄音,去河邊找鬼唁盏。 笑死内狸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的厘擂。 我是一名探鬼主播昆淡,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刽严!你這毒婦竟也來了昂灵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤舞萄,失蹤者是張志新(化名)和其女友劉穎眨补,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倒脓,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡撑螺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了崎弃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甘晤。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡含潘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出线婚,到底是詐尸還是另有隱情遏弱,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布塞弊,位于F島的核電站腾窝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏居砖。R本人自食惡果不足惜虹脯,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奏候。 院中可真熱鬧循集,春花似錦、人聲如沸蔗草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咒精。三九已至镶柱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間模叙,已是汗流浹背歇拆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留范咨,地道東北人故觅。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像渠啊,于是被迫代替她去往敵國和親输吏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容