新四季網

一種基於JPF的Java代碼SSA單路徑的生成方法與流程

2023-06-07 03:53:46


本發明涉及一種基於JPF的Java代碼SSA單路徑的生成方法。



背景技術:

程序靜態分析(Program Static Analysis)是在不運行程序的前提下進行的代碼分析工作,隨著越來越多的代碼被上傳到開原始碼庫中,大多數代碼不可以直接運行,我們要對這些開原始碼進行分析理解,就需要藉助靜態分析技術。靜態分析技術中經常會涉及到符號執行(Symbolic Execution),抽象語法樹(Abstract Syntax Tree,AST)分析,控制流分析(Control Flow Analysis)等,借鑑這些靜態分析技術的思想,我們旨在提供一種Java代碼靜態單賦值(Static Single Assignment,SSA)格式的單路徑的生成方法支持Java代碼靜態分析方面的工作,研究者可以在該工具的基礎上進行Java代碼的分析,降低了直接從代碼文本進行分析的複雜性。

JPF(Java PathFinder)是由NASA開發的針對Java程序的模型檢驗工具,它的核心是一個Java虛擬機,其符號執行模塊jpf-symbc可以對Java代碼進行符號執行,提取出程序中的每一條可達路徑以及路徑上的約束。

JDT(Java Development Tools)是Eclipse提供的一組用於實現Java IDE的工具,核心是AST,利用JDT提供的AST訪問API,我們可以將Java代碼轉化成AST,遍歷AST樹節點,修改AST樹結構並將修改寫回到原始碼。



技術實現要素:

針對現有技術中存在的問題,本發明目的是,提供一種Java代碼SSA格式的單路徑的生成方法支持Java代碼靜態分析方面的工作,研究者可以在該工具的基礎上進行Java代碼的分析,降低了直接從代碼文本進行分析的複雜性。

本發明是通過以下的技術方案實現的:一種基於JPF的Java代碼SSA單路徑的生成方法,包括步驟:

步驟10:輸入.java文件和.jpf文件,存放在src目錄下;

步驟11:對.java文件進行代碼插樁,以便獲得path condition;

步驟12:編譯得到.class文件,存放在bin目錄下;

步驟13:從.jpf文件獲得JPF執行的相關參數;

步驟14:使用JPF的jpf-symbc模塊對.class文件進行符號執行,獲取指定方法中的可達的單路徑,根據插樁信息提取出path condition;

步驟15:使用JDT AST修改單路徑代碼的AST,將單路徑轉化為SSA的格式;

步驟16:將SSA格式的單路徑以及path condition封裝成符合Java語法規範的Java類,存放在path目錄下,作為輸出。

其中步驟10所輸入的Java工程原始碼和JPF配置文件具有如下的目錄結構:

經過步驟16之後,最終輸出相應的結果:

在步驟11中,進行代碼插樁過程包括:

步驟20:使用ASTParser獲得單路徑代碼的AST;

步驟21:使用ASTVisitor遍歷Java代碼的AST獲取所有控制轉移語句如IfStatement,WhileStatement,以IfStatement為例;

步驟22:使用ASTRewrite修改AST的樹結構,在IfStatement成立的程序入口(ThenStatement)處插入一條空的IfStatement,控制條件與當前控制語句的控制條件相同;

步驟23:使用ASTRewrite修改AST的樹結構,在IfStatement不成立的程序入口(ElseSatement)處插入一條空的IfStatement,控制條件為當前控制語句的控制條件的非;

步驟24:將上述修改操作寫回到原始碼。

在步驟14中,使用JPF的jpf-symbc對.class文件進行符號執行,獲取指定方法中的可達的單路徑,根據插樁信息提取出path condition的過程包括:

步驟30:將.jpf中的配置信息傳給JPF啟動類,其中.jpf文件的書寫遵循JPF配置文件的書寫規範

步驟31:將classpath指定為步驟12得到的bin目錄,將sourcepath指定為src目錄,將Listener設為MyPathListener;

步驟32:MyListener是工具自定義的一個ListenerAdapter,它在JPF執行過程中監聽每一條指令的執行,抽取出每條指令所對應的原始碼行號;

步驟33:JPF會執行Java代碼中的每一條路徑,在執行過程中我們獲得每一條路徑對應的行號序列,將其對應到原始碼,提取插樁信息作為path condition。

處理流程如圖5所示:本發明實施例的監聽JPF指令執行獲得單路徑示意圖。

在步驟15中,將單路徑轉化為SSA的形式的過程包括:

步驟40:使用ASTParser獲得單路徑代碼的AST;

步驟41:使用ASTVisitor遍歷AST,收集變量的聲明、引用、賦值;

步驟42:使用ASTRewrite刪掉AST所有關於變量聲明的ASTNode;

步驟43:每當變量被賦值,就為該變量賦予一個新的變量名(對應AST中的SimpleName節點),使之成為一個新變量,該次賦值之後到下一次賦值之前對變量的引用均用新的變量名替換,在程序的開頭添加新變量的聲明;

步驟44:將上述修改操作寫回到原始碼。

本發明有益效果:這是一個原始碼層面的藉助於JPF提取Java代碼中的單路徑然後利用JDT AST將其轉化為SSA格式的靜態分析輔助工具,利用這種工具,Java程序被簡化成了一條條SSA格式的單路徑代碼,從而降低了直接從原始碼進行分析的複雜性。

附圖說明

圖1本發明實施例的Java代碼轉化為SSA單路徑示意圖。

圖2本發明實施例的輸入目錄結構示意圖。

圖3本發明實施例的輸出目錄結構示意圖。

圖4本發明實施例的代碼插樁獲得路徑條件示意圖。

圖5本發明實施例的監聽JPF指令執行獲得單路徑示意圖。

圖6本發明實施例的單路徑代碼轉換為SSA格式示意圖。

具體實施方式

以下結合附圖和具體實施例對本發明作進一步詳細說明。

本發明方法工作流程如圖1-圖6所示。

圖1所示為本方法實施的整體結構和工作原理。本方法的目的是提供一個原始碼層面的藉助於JPF提取Java代碼中的單路徑然後利用JDT AST將其轉化為SSA格式的靜態分析輔助工具,利用這種工具,Java程序被簡化成了一條條SSA格式的單路徑代碼,從而降低了直接從原始碼進行分析的複雜性。

本實施例的一種基於JPF的Java代碼SSA單路徑的生成方法,包括如下步驟:

步驟10:輸入.java文件和.jpf文件,存放在src目錄下;

步驟11:對.java文件進行代碼插樁,以便獲得path condition;

步驟12:編譯得到.class文件,存放在bin目錄下;

步驟13:從.jpf文件獲得JPF執行的相關參數;

步驟14:使用JPF的jpf-symbc模塊對.class文件進行符號執行,獲取指定方法中的可達的單路徑,根據插樁信息提取出path condition;

步驟15:使用JDT AST修改單路徑代碼的AST,將單路徑轉化為SSA的格式;

步驟16:將SSA格式的單路徑以及path condition封裝成符合Java語法規範的Java類,存放在path目錄下,作為輸出。

圖2表示的是步驟10所輸入的Java工程原始碼和JPF配置文件所在src目錄的目錄結構示意圖。其中步驟10所輸入的Java工程原始碼和JPF配置文件具有如下的目錄結構:

圖3表示的是經過步驟16之後,存放單路徑代碼的path目錄所具有的目錄結構示意圖。經過步驟16之後,最終的輸出結果如下:

圖4表示的是在步驟11中使用JDT AST進行代碼插樁的處理示意圖,執行的過程包括:

步驟20:使用ASTParser獲得單路徑代碼的AST;

步驟21:使用ASTVisitor遍歷Java代碼的AST獲取所有控制轉移語句如IfStatement,WhileStatement,下面以IfStatement為例;

步驟22:使用ASTRewrite修改AST的樹結構,在IfStatement成立的程序入口(ThenStatement)處插入一條空的IfStatement,控制條件與當前控制語句的控制條件相同;

步驟23:使用ASTRewrite修改AST的樹結構,在IfStatement不成立的程序入口(ElseSatement)處插入一條空的IfStatement,控制條件為當前控制語句的控制條件的非;

步驟24:將上述修改操作寫回到原始碼。

下面給出一個插樁前後對比的例子:

圖5表示的是在步驟14中使用JPF的jpf-symbc對.class文件進行符號執行,獲取指定方法中的可達的單路徑,根據插樁信息提取出path condition的處理示意圖,執行的過程包括:

步驟30:將.jpf中的配置信息傳給JPF啟動類,其中.jpf文件的書寫遵循JPF配置文件的書寫規範;

步驟31:將classpath指定為步驟12得到的bin目錄,將sourcepath指定為src目錄,將Listener設為MyPathListener;

步驟32:MyListener是工具自定義的一個ListenerAdapter,它在JPF執行過程中監聽每一條指令的執行,抽取出每條指令所對應的原始碼行號;

步驟33:JPF會執行Java代碼中的每一條路徑,在執行過程中我們獲得每一條路徑對應的行號序列,將其對應到原始碼,提取插樁信息作為path condition。

處理流程如圖5所示:本發明實施例的監聽JPF指令執行獲得單路徑示意圖。

圖6表示的是在步驟15中,將單路徑轉化為SSA的形式的處理示意圖,執行的過程包括:

步驟40:使用ASTParser獲得單路徑代碼的AST;

步驟41:使用ASTVisitor遍歷AST,收集變量的聲明、引用、賦值;

步驟42:使用ASTRewrite刪掉AST所有關於變量聲明的ASTNode;

步驟43:每當變量被賦值,就為該變量賦予一個新的變量名(對應AST中的SimpleName節點),使之成為一個新變量,該次賦值之後到下一次賦值之前對變量的引用均用新的變量名替換,在程序的開頭添加新變量的聲明;

步驟44:將上述修改操作寫回到原始碼。

下面給出一個轉換前後對比的例子:

以上所述,僅為本發明的較佳實施例而已,並非對本發明作任何形式上的限制,雖然本發明已以較佳實施例揭露如上,然而並非用以限定本發明,任何熟悉本專業的技術人員,在不脫離本發明技術方案範圍內,當可利用上述揭示的技術內容作出些許更改或修飾為等同變化的等效例,則仍屬於本發明技術方案的保護範圍內。

同类文章

一種新型多功能組合攝影箱的製作方法

一種新型多功能組合攝影箱的製作方法【專利摘要】本實用新型公開了一種新型多功能組合攝影箱,包括敞開式箱體和前攝影蓋,在箱體頂部設有移動式光源盒,在箱體底部設有LED脫影板,LED脫影板放置在底板上;移動式光源盒包括上蓋,上蓋內設有光源,上蓋部設有磨沙透光片,磨沙透光片將光源封閉在上蓋內;所述LED脫影

壓縮模式圖樣重疊檢測方法與裝置與流程

本發明涉及通信領域,特別涉及一種壓縮模式圖樣重疊檢測方法與裝置。背景技術:在寬帶碼分多址(WCDMA,WidebandCodeDivisionMultipleAccess)系統頻分復用(FDD,FrequencyDivisionDuplex)模式下,為了進行異頻硬切換、FDD到時分復用(TDD,Ti

個性化檯曆的製作方法

專利名稱::個性化檯曆的製作方法技術領域::本實用新型涉及一種檯曆,尤其涉及一種既顯示月曆、又能插入照片的個性化檯曆,屬於生活文化藝術用品領域。背景技術::公知的立式檯曆每頁皆由月曆和畫面兩部分構成,這兩部分都是事先印刷好,固定而不能更換的。畫面或為風景,或為模特、明星。功能單一局限性較大。特別是畫

一種實現縮放的視頻解碼方法

專利名稱:一種實現縮放的視頻解碼方法技術領域:本發明涉及視頻信號處理領域,特別是一種實現縮放的視頻解碼方法。背景技術: Mpeg標準是由運動圖像專家組(Moving Picture Expert Group,MPEG)開發的用於視頻和音頻壓縮的一系列演進的標準。按照Mpeg標準,視頻圖像壓縮編碼後包

基於加熱模壓的纖維增強PBT複合材料成型工藝的製作方法

本發明涉及一種基於加熱模壓的纖維增強pbt複合材料成型工藝。背景技術:熱塑性複合材料與傳統熱固性複合材料相比其具有較好的韌性和抗衝擊性能,此外其還具有可回收利用等優點。熱塑性塑料在液態時流動能力差,使得其與纖維結合浸潤困難。環狀對苯二甲酸丁二醇酯(cbt)是一種環狀預聚物,該材料力學性能差不適合做纖

一種pe滾塑儲槽的製作方法

專利名稱:一種pe滾塑儲槽的製作方法技術領域:一種PE滾塑儲槽一、 技術領域 本實用新型涉及一種PE滾塑儲槽,主要用於化工、染料、醫藥、農藥、冶金、稀土、機械、電子、電力、環保、紡織、釀造、釀造、食品、給水、排水等行業儲存液體使用。二、 背景技術 目前,化工液體耐腐蝕貯運設備,普遍使用傳統的玻璃鋼容

釘的製作方法

專利名稱:釘的製作方法技術領域:本實用新型涉及一種釘,尤其涉及一種可提供方便拔除的鐵(鋼)釘。背景技術:考慮到廢木材回收後再加工利用作業的方便性與安全性,根據環保規定,廢木材的回收是必須將釘於廢木材上的鐵(鋼)釘拔除。如圖1、圖2所示,目前用以釘入木材的鐵(鋼)釘10主要是在一釘體11的一端形成一尖

直流氧噴裝置的製作方法

專利名稱:直流氧噴裝置的製作方法技術領域:本實用新型涉及ー種醫療器械,具體地說是ー種直流氧噴裝置。背景技術:臨床上的放療過程極易造成患者的局部皮膚損傷和炎症,被稱為「放射性皮炎」。目前對於放射性皮炎的主要治療措施是塗抹藥膏,而放射性皮炎患者多伴有局部疼痛,對於止痛,多是通過ロ服或靜脈注射進行止痛治療

新型熱網閥門操作手輪的製作方法

專利名稱:新型熱網閥門操作手輪的製作方法技術領域:新型熱網閥門操作手輪技術領域:本實用新型涉及一種新型熱網閥門操作手輪,屬於機械領域。背景技術::閥門作為流體控制裝置應用廣泛,手輪傳動的閥門使用比例佔90%以上。國家標準中提及手輪所起作用為傳動功能,不作為閥門的運輸、起吊裝置,不承受軸向力。現有閥門

用來自動讀取管狀容器所載識別碼的裝置的製作方法

專利名稱:用來自動讀取管狀容器所載識別碼的裝置的製作方法背景技術:1-本發明所屬領域本發明涉及一種用來自動讀取管狀容器所載識別碼的裝置,其中的管狀容器被放在循環於配送鏈上的文檔匣或託架裝置中。本發明特別適用於,然而並非僅僅專用於,對引入自動分析系統的血液樣本試管之類的自動識別。本發明還涉及專為實現讀