Соответствие шаблону Javaparser AST

Мне нужно выполнить некоторые операции с AST, созданным синтаксическим анализатором java. Моя проблема в том, что я хочу проверить, есть ли проблема с циклом инициализации класса или нет.

Один пример:

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, но не получил подходящего решения.


person unni teja    schedule 25.04.2016    source источник


Ответы (1)


С помощью JavaParser вы можете легко получить все статические поля и статические инициализаторы.

Проблема, которую я вижу в этом, заключается в том, что вам нужно разрешать ссылки. Например, вам нужно понимать, что «mark2.p» и «mark1.x» относятся к статическим полям других классов. С точки зрения AST это доступ к полю, но AST и JavaParser сами по себе не могут сказать вам, что это конкретное поле является статическим. Для этого вам нужно использовать решатель символов, например https://github.com/ftomassetti/java-symbol-solver/ или вы можете построить логику самостоятельно. Например, вам может понадобиться просмотреть импорт и посмотреть, был ли импортирован класс mark1 или присутствует ли один класс с именем mark1 в том же пакете, что и mark2. Сделав это, вы могли бы распознать, что mark1 — это имя класса, и искать в этом классе символ p. Затем вы можете найти его и заметить, что это статическое поле.

Источник: я участник JavaParser

person Federico Tomassetti    schedule 25.04.2016
comment
Спасибо за ответ, сэр. Я хочу реализовать это правило securecoding .cert.org/confluence/display/java/. Я получил AST с помощью javaparser. Я хочу выполнить сопоставление с образцом, чтобы найти эту уязвимость, но я застрял здесь. - person unni teja; 25.04.2016