1. 程式人生 > >使用程式碼分析工具SOOT經驗總結

使用程式碼分析工具SOOT經驗總結

好久沒寫技術部落格了,之前寫的都是關於linux環境下資源監測方面的內容,比賽做完以後改做Android移動平臺的研究,主要關注能耗這部分,有興趣的童鞋可以多交流。

最近因為工作需要我需要分析JAVA程式,師兄師姐們首推SOOT,看過入門文件後也覺得SOOT功能很強大,上次去PLDI會議的workshop還看到了現在SOOT的負責人Eric Bodden,很帥的一個小夥子偷笑,言歸正傳~

Soot的安裝和使用參考官網http://www.sable.mcgill.ca/soot/ 的supervisor guide就可以,跑通裡面的例子就能對soot的功能有大體的瞭解。下面是我在後期使用遇到的問題及解決辦法。

1. Error: class com.ByteCodeStyle read in from a classfile in which ByteCodeStyle was expected.

這個問題是在程式內部設定了 -soot-classpath, -process-path引數後出現的。

-soot-classpath:C:\*****\workspace\SeeByteCode\bin\com

-process-path:C:\*****\workspace\SeeByteCode\bin\com


從邏輯上考慮我已經將要處理的類ByteCodeStyle的路徑告訴了soot,它應該可以找到類。我們再看一下錯誤資訊soot在類檔案讀到的類名是com.ByteCodeStyle,但是它需要的類名卻是ByteCodeStyle。這兩個名稱的差別就在於前者多了一個包名。下一步跟蹤到最底層錯誤產生的程式碼(Util.java):


往上找呼叫這個方法的程式碼可以發現name是從類檔案中讀出的類名,bclass.getName()是從使用者指定的路徑中讀出來的類名,所以我們設定的路徑下的類名就是ByteCodeStyle,再看一下這個類檔案的位元組碼


讀出的com.ByteCodeStyle和路徑下的ByteCodeStyle不匹配,對應的解決方法就是修改-process-path和-soot-classpath,把它們都改成C:\*****\workspace\SeeByteCode\bin,比上面的路徑少了一個\com,soot預設把這個子目錄名當做包名,這樣路徑下的類檔名就是com.ByteCodeStyle,與類檔案讀出來的就一致了。DONE~

2. 在執行文件中控制流例子的時候遇到的問題,程式碼

         SootClass c=Scene.v().loadClassAndSupport("com.ByteCodeStyle");
	 c.setApplicationClass();
	 SootMethod m=c.getMethodByName("add");
	 Body b=m.retrieveActiveBody();
	 UnitGraph g= new ExceptionalUnitGraph(b);
	 Iterator i=g.iterator();
	 while(i.hasNext())
	 {
		 Unit u=(Unit)i.next();//........

	 }
錯誤資訊: Exception in thread "main" java.lang.NullPointerException,跟蹤錯誤定位在Body b=m.retrieveActiveBody();m為null所以產生了空指標異常,說明之前才,c.getMethodByName("add");出現問題,也可以判定soot並沒有成功載入方法,之前在網上查了一些資料都沒有找到合適的解決辦法,最後向soot-list裡面的大牛發郵件詢問,很快就收到了Phil Pratt-Szeliga的回覆,他發給我一個程式碼檔案,建議我通過Transformer去載入類和方法,一試果然有效,現附上大牛的程式碼檔案,希望能有所幫助。
import java.util.Iterator;
import java.util.Map;
import soot.*;
import soot.toolkits.graph.BriefUnitGraph;
import soot.toolkits.graph.UnitGraph;
//wrote by Phil Pratt-Szeliga
class Example {

  public void run(String dir){
    
    Printer printer = new Printer();
    Transform t1 = new Transform("jtp.Printer", printer);
    PackManager.v().getPack("jtp").add(t1);
    
    int size = 4;
    String[] soot_args = new String[size];
    soot_args[0] = "-process-dir";
    soot_args[1] = dir;
    soot_args[2] = "-pp";
    soot_args[3] = "-allow-phantom-refs";
    soot.Main.main(soot_args);
  }

  public static void main(String[] args){
    Example example = new Example();
    example.run("build/classes/");
  }

  class Printer extends BodyTransformer {

    @Override
    protected void internalTransform(Body body, String string, Map map) {
      SootMethod method = body.getMethod();
      if(method.getName().equals("main") == false){
        return;
      }
      UnitGraph g=new BriefUnitGraph(body);
      Iterator it=g.iterator();
      while(it.hasNext()){
        Unit u=(Unit)it.next();
      }
    }
  }
}

目前還遇到一個問題,等找到解決方案後再寫出來。

相關推薦

使用程式碼分析工具SOOT經驗總結

好久沒寫技術部落格了,之前寫的都是關於linux環境下資源監測方面的內容,比賽做完以後改做Android移動平臺的研究,主要關注能耗這部分,有興趣的童鞋可以多交流。 最近因為工作需要我需要分析JAVA程式,師兄師姐們首推SOOT,看過入門文件後也覺得SOOT功能很強大,上次

PVS-Studio C/C++/C++11 靜態程式碼分析工具

  靜態程式碼分析儀是一種檢測程式碼缺陷、分析對比 商業程式碼的工具,它分析原始碼和它生成的目標 檔案,但並不實際執行原始碼。應用於對安全性、 穩定性要求很高的領域,比如航天、國防、工業 控制、金融等就需要嚴格的程式碼分析工具。PVS-Studio 能發現程式碼中一些潛

PHP工具箱:PHPStan —— PHP 靜態程式碼分析工具

PHPStan:無需寫測試就能找到程式碼中的 Bug 每當我看到開發人員從 Java 或 C# 等編譯語言切換到 PHP 這樣的解釋語言時解放了生產力後感到很高興。除了這些常規的執行模型(發起、處理請求和結束請求)和更短的反饋環(無需等待編譯器)外,還有一個能解決開發人員日常問題的開源框架

Findbugs、PMD、CheckStyles程式碼分析工具介紹

FindBugs、PMD和CheckStyle對比 1.     概要 工具 目的 檢查項 FindBugs 檢查.class 基於Bug Pattern

靜態程式碼分析工具清單:開源篇(各語言)

本文是一個靜態程式碼分析工具的清單,共有26個工具。包括4個.NET工具、2個Ada工具、7個C++工具、4個Java工具、2個JavaScript工具、1個Opa工具、2個Packaging工具、3個Perl工具、1個Python工具。 1.NET .NET Compiler Platfo

程式碼分析工具 Pylint安裝+pycharm下的配置

Pylint 是一個 Python 程式碼分析工具,它分析 Python 程式碼中的錯誤,查詢不符合程式碼風格標準(Pylint 預設使用的程式碼風格是 PEP 8)和有潛在問題的程式碼。 。它與幾個流行的編輯器和IDE很好地整合,也可以從命令列執行。 1、安裝 命令列執行pip install pylint

PVS-Studio C/C++/C++11 靜態程式碼分析工具

靜態程式碼分析儀是一種檢測程式碼缺陷、分析對比 商業程式碼的工具,它分析原始碼和它生成的目標 檔案,但並不實際執行原始碼。應用於對安全性、 穩定性要求很高的領域,比如航天、國防、工業 控制、金融等就需要嚴格的程式碼分析工具。PVS-Studio 能發現程式碼中一些潛在

Cppcheck 1 54 C/C++靜態程式碼分析工具

64-bit portabilityCheck if there is 64-bit portability issues:assign address to/from int/longAuto VariablesA pointer to a variable is only valid as long as

程式碼分析工具】starTool 2.0使用HTML做程式碼地圖分析

【設計背景】 當前starTool已經可以完整輸出一個產品的程式碼地圖,類似於如下 工具介紹連結:https://blog.csdn.net/weixin_39020940/article/details/80633835 這樣確實能比較好的縱覽整個工程的程式碼結構,但是對於類

程式碼分析工具--sonar

一 什麼是sonar  Sonar (SonarQube)是一個開源平臺,用於管理原始碼的質量。Sonar 不只是一個質量資料報告工具,更是程式碼質量管理平臺。支援的語言包括:Java、PHP、

Android應用記憶體洩露分析、改善經驗總結

前言   通過這幾天對好幾個應用的記憶體洩露檢測和改善,效果明顯: 完全退出應用時,手動觸發GC,從原來佔有記憶體100多M降到低於20M; 手動觸發GC後,通過adb shell dumpsys meminfo packagename -d檢視Activity和View的數量也趨近於0了(沒有做到歸零

程式碼分析工具推薦Understand

之前看ogitor ,第一次看到那麼多程式碼~~不知道從哪裡下手,而且好多東西都不會Ogre什麼的都不是很清楚,對ogitor的程式碼結構的瞭解就更不用提了。暈頭轉向的不知道從哪裡下手,一點點的看起來好吃力。後來從部落格中看到了說understand的 ,當時用了一下可

讓Visual Studio的程式碼分析工具提高你的程式碼質量

靜態程式碼分析工具,第三方的有很多。其實visual studio有的版本里面也有的哦,通過Q—A的引子希望本文可以起到拋磚引玉的作用。 Q:為什麼我的Visual Studio中沒有程式碼分析功能([分析]選單中[僅對...執行程式碼分析])。 A:你的vs版本是下面其

如何做軟體需求分析(個人工作經驗總結)

前言: 需求對於我們IT人來講是一個再熟悉不過的名詞了,如何在專案開發週期做需求,那就是各有各的道了,下面是我對軟體開發過程中對做需求的理解和總結。希望能給大家帶來一點不同的感官。 1什麼是需求,需求分析在整個開發週期的作用。           對於需求概念來講

靜態程式碼分析工具大比拼(C++篇)

1引言 靜態程式碼分析是指無需執行被測程式碼,通過詞法分析、語法分析、控制流、資料流分析等技術對程式程式碼進行掃描,找出程式碼隱藏的錯誤和缺陷,如引數不匹配,有歧義的巢狀語句,錯誤的遞迴,非法計算,可能出現的空指標引用等等。統計證明,在整個軟體開發生命週期中,30% 至

靜態程式碼分析工具列表分析---程式碼分析工具列表(30款工具

本文是一個靜態程式碼分析工具的清單,共有30個工具。包括4個.NET工具、2個Ada工具、7個C++工具、4個Java工具、2個JavaScript工具、1個Opa工具、2個Packaging工具、3個Perl工具、1個Python工具、1個嵌入式工具、2個二進位制工具

【JSHint解讀一】JavaScript的靜態程式碼分析工具

簡介 JSHint是一個社群驅動用來檢測JavaScript程式碼中錯誤和潛在的問題在和執行團隊的編碼規範工具。它非常靈活,因此可以很容易地適應您特定的編碼規則和你的程式碼執行環境。JSHint將永遠保持開源的方式。 目標 這個專案的目標是幫助Java

靜態分析工具PMD使用總結

簡介: PMD 掃描java原始碼,查詢潛在的問題,如: 可能的bugs,如空的try/catch/finally/switch宣告 死亡的程式碼,沒有使用的本地變數,引數和私有方法 不合標準的程式碼,如String/StringBuffer用法 過於複雜的表示式,如不必

常用 Java 靜態程式碼分析工具分析與比較

簡介: 本文首先介紹了靜態程式碼分析的基本概念及主要技術,隨後分別介紹了現有 4 種主流 Java 靜態程式碼分析工具

【工利其器】必會工具之(八)PMD篇——程式碼分析工具基本使用

       轉載請申明,轉載自【https://www.cnblogs.com/andy-songwei/p/11830812.html】,謝謝!        如今,使用程式碼分析工具來代替人工進行程式碼審查,已經是大勢所趨了