2016-04-25 83 views
0

我需要對由java解析器生成的AST執行一些操作。我的問題是我想檢查一個類的初始化週期問題是否存在。Javaparser AST模式匹配

一個例子是,

class mark1 { 
    public static final int x = mark2.p * 5; 
    //Do some operations here 
} 

class mark2 { 
public static final int p = mark1.x + 100; 
//Do some operations here 
} 

的類的初始化順序可以變化,從而導致對mark1.x和mark2.p不同的值的計算。我試圖用javaparser生成的AST實現它,但沒有得到一個可行的解決方案。

回答

0

使用JavaParser,您可以輕鬆獲取所有靜態字段和靜態初始化程序。

我看到的問題是您需要解析引用。例如,您需要了解「mark2.p」和「mark1.x」是指其他類的靜態字段。從AST的角度來看,它們是字段訪問,但AST和JavaParser本身並不能告訴你該特定字段是靜態的。爲此,您需要使用像https://github.com/ftomassetti/java-symbol-solver/這樣的符號求解器,或者您可以自己構建邏輯。例如,您可能需要查看導入並查看mark1類是否已導入,或者是否有一個名爲mark1的類與mark2存在於同一個包中。這樣做可以識別出mark1是一個類的名稱,並查看該類的符號p。然後您可以找到它並注意它是一個靜態字段。

來源:我是JavaParser撰稿人

+0

感謝您的回覆先生。我想實現這個規則https://www.securecoding.cert.org/confluence/display/java/DCL00-J.+Prevent+class+initialization+cycles。我使用javaparser得到了AST。我想做一個模式匹配來找到這個漏洞,但我堅持在這裏。 –