Findbugs自定義rulesets

增加自定義findbugs規(guī)則集

增加自定義檢測(cè)模式的一般流程

簡(jiǎn)易流程

上層接口和父類

Priority接口

public interface Priorities {
    public static final int IGNORE_PRIORITY = 5;//忽略bug
    public static final int EXP_PRIORITY = 4;
    public static final int LOW_PRIORITY = 3;//低優(yōu)先級(jí)
    public static final int NORMAL_PRIORITY = 2;//普通優(yōu)先級(jí)
    public static final int HIGH_PRIORITY = 1;//高優(yōu)先級(jí)
}

Detector接口

/**
 * bug pattern檢測(cè)必須要實(shí)現(xiàn)該接口
 */
public interface Detector extends Priorities {
    /**
     * Visit the ClassContext for a class which should be analyzed for instances
     * of bug patterns.
     */
    public void visitClassContext(ClassContext classContext);
    /**
     * This method is called after all classes to be visited. It should be used
     * by any detectors which accumulate information over all visited classes to
     * generate results.
     */
    public void report();
}

BugInstance類

    /**
     * @param detector
     *            the Detector that is reporting the BugInstance
     * @param type
     *            the bug type
     */
public BugInstance(Detector detector, String type, int priority) {
        this(type, priority);
        if (detector != null) {
            // Adjust priority if required
            String detectorName = detector.getClass().getName();
            adjustForDetector(detectorName);
        }
    }

Bytecode 框架

  • 所有的bug detector都是用bytecode分析
  • 大部分的detector用以下技術(shù)實(shí)現(xiàn)
  • inspect class/method/field
  • micropattern:simple bytecode pattern
  • stack-based pattern
  • dataflow analysis
  • interprocedural analysis

1. Inspect class/method/field

某些detector不需要code 分析
1. 發(fā)現(xiàn)類override equals()方法沒(méi)重寫hashCode()方法
2. 方法命名錯(cuò)誤(hashCode()寫成了hashcode()方法)

2. Micropatterns: simple bytecode patterns

synchronized (lock) {                 ALOAD 0
 lock.wait();                         GETFIELD A.lock
 ...                                  DUP
}                                     ASTORE 1
                                      MONITORENTER
                                      ALOAD 0
                                      GETFIELD A.lock
                                      INVOKEVIRTUAL
                                      Object.wait()V

3. Stack-based patterns

  • Micropatterns where the values on the operand stack are significant
  • Example:
  • As seen earlier: look for monitorenter on constant String value
  • Typical implementation strategy:
  • Inquire about values on operand stack
  • Warn when suspicious instruction sequence/stack values
    seen

一般性檢測(cè)器

BytecodeScanningDetector
對(duì)于掃描字節(jié)碼的需求聂抢,一般是擴(kuò)展這個(gè)類蜓谋。

Visit
有很多不同參數(shù)的方法。表示訪問(wèn)類枕面、或者代碼卵慰、方法等時(shí)候會(huì)調(diào)用該方法。
一般用該方法進(jìn)行訪問(wèn)前的初始化**工作**。
 public void visit(Code obj)     分析方法內(nèi)容時(shí)調(diào)用visit(Code) 方法大溜,往往用于分析方法代碼前進(jìn)行初始化工作
 public void visit(JavaClass obj)      分析該類之前,調(diào)用該方法估脆。往往用于取得類的信息
 public void visitField(Field obj)       分析類的屬性前钦奋,調(diào)用該方法,往往用于取得類的屬性信息

分析字節(jié)碼

>>例1
public void sawOpcode(int seen)
>>在分析方法正文中的每一個(gè)操作碼時(shí)調(diào)用sawOpcode(int)方法疙赠。
>> seen就是每條的操作碼付材,操作碼在反編譯后都能看到
 指令碼都是該類的常量,可以找到
public void show();
 Code:
  0:  getstatic      #29; //Field java/lang/System.out:Ljava/io/PrintStream;
  3:  ldc    #48; //String ssssssssssssss00s
  5:  invokevirtual  #35; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
  8:  return
>>取得該指令對(duì)于的類
getClassConstantOperand()
對(duì)于第5行:可以取到j(luò)ava/io/PrintStream
>>取得該指令對(duì)應(yīng)的類執(zhí)行的方法的名字
getNameConstantOperand()
對(duì)于第5行:可以取到println
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
例2
匯編代碼:
public void doBadStuff();
 Code:
  0:    invokestatic    #2; //Method java/lang/System.gc:()V
  3:   return
查找調(diào)用了System.gc的代碼
public void sawOpcode(int seen) {
       if (seen == INVOKESTATIC) {
           if (getClassConstantOperand().equals("java/lang/System")
                   && getNameConstantOperand().equals("gc")) {
               bugReporter.reportBug(new BugInstance("SYSTEM_GC", NORMAL_PRIORITY)
                       .addClassAndMethod(this)
                       .addSourceLine(this));
           }
       }
   }
}

public void sawMethod()
>>每分析一個(gè)方法前圃阳,都會(huì)調(diào)用該方法
>>取得類的名字
String className = super.getClassName().replaceAll("/", ".");
>>取得方法的名字
this.getMethod().getName()
>>取得方法的返回類型
String returnType = this.getMethod().getReturnType().toString();
>>取得方法是否為靜態(tài)
             boolean isStatic = this.getMethod().isStatic();
>>取得方法是否為公開的
             boolean isPublic = this.getMethod().isPublic();
>>例如:
public void sawMethod() {
             if (isPublicStaticMethord) {
                    return;
             }
//class name:   demo/First|| methord name :show|| ReturnType() name :  //demo.Second  //accce flag=   1  
             String className = super.getClassName().replaceAll("/", ".");
             String returnType = this.getMethod().getReturnType().toString();
             boolean isStatic = this.getMethod().isStatic();
             boolean isPublic = this.getMethod().isPublic();
             //單例判斷
             if (isPublic && isStatic) {//如果為公有的靜態(tài)的
                    if (className != null && className.equals(returnType)) {//如果返回值就是本類
                           isPublicStaticMethord = true;
                    }
             }
      }

生成報(bào)表

1厌衔、構(gòu)造函數(shù)里面會(huì)傳遞報(bào)表參數(shù)
public SingletonDector(BugReporter bugReporter) {
      this.bugReporter= bugReporter;
   }
2.在恰當(dāng)?shù)牡胤秸{(diào)用報(bào)表
一般是在visitXXX sawXXX地方檢查的時(shí)候調(diào)用
bugReporter.reportBug(newBugInstance("MULTITHREAD_SINGLETON",NORMAL_PRIORITY)
                 .addClass(this)) ;
>>MULTITHREAD_SINGLETON
  就是配置的報(bào)表的名字
>>addXXX
 就是傳遞給報(bào)表的屬性,在報(bào)表里面是可以取到的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捍岳,一起剝皮案震驚了整個(gè)濱河市富寿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锣夹,老刑警劉巖页徐,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異银萍,居然都是意外死亡变勇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門贴唇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搀绣,“玉大人飞袋,你說(shuō)我怎么就攤上這事×椿迹” “怎么了巧鸭?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)麻捻。 經(jīng)常有香客問(wèn)我蹄皱,道長(zhǎng),這世上最難降的妖魔是什么芯肤? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任巷折,我火速辦了婚禮,結(jié)果婚禮上崖咨,老公的妹妹穿的比我還像新娘锻拘。我一直安慰自己,他們只是感情好击蹲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布署拟。 她就那樣靜靜地躺著,像睡著了一般歌豺。 火紅的嫁衣襯著肌膚如雪推穷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天类咧,我揣著相機(jī)與錄音馒铃,去河邊找鬼。 笑死痕惋,一個(gè)胖子當(dāng)著我的面吹牛区宇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播值戳,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼议谷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了堕虹?” 一聲冷哼從身側(cè)響起卧晓,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赴捞,沒(méi)想到半個(gè)月后逼裆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡螟炫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年波附,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艺晴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昼钻。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掸屡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出然评,到底是詐尸還是另有隱情仅财,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布碗淌,位于F島的核電站盏求,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏亿眠。R本人自食惡果不足惜碎罚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纳像。 院中可真熱鬧荆烈,春花似錦、人聲如沸竟趾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)岔帽。三九已至玫鸟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犀勒,已是汗流浹背屎飘。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贾费,地道東北人枚碗。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铸本,于是被迫代替她去往敵國(guó)和親肮雨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 好消息: 中國(guó)特色小鎮(zhèn)波丰,你們展示風(fēng)采的機(jī)會(huì)來(lái)啦! 在9月23日舉行的中國(guó)特色小鎮(zhèn)短視頻大賽發(fā)布會(huì)上舶得,國(guó)家發(fā)改委城市...
    背著書包去遠(yuǎn)方閱讀 283評(píng)論 0 0
  • 笑來(lái)老師曾問(wèn)我們掰烟,試著想想你周圍讓你欽佩的人,他們身上都有哪些特質(zhì)值得你學(xué)習(xí)?我當(dāng)時(shí)很茫然纫骑,腦子一片空白蝎亚。實(shí)在想不...
    JuneSnow閱讀 330評(píng)論 0 4
  • 繼續(xù)摘能量信息化論壇修改了稿子上午口語(yǔ)文化KO中午溝通了冥王星計(jì)劃章程中午跟老爸去車管所消分、建行小票票繼續(xù)存下午...
    dq920813閱讀 110評(píng)論 0 0