Как я могу найти все варианты использования ValueDecl? - PullRequest
0 голосов
/ 26 июня 2018

Я хотел бы взять Clang AST, проанализировать, как используется определенная переменная и сделать некоторые преобразование источника в источник, если распознан определенный шаблон использования. В частности, я ищу такие шаблоны:

void *h;
h = create_handler(...);
use_handler(h);
destroy_handler(h);

Пока что я могу обнаружить ValueDecl, соответствующий void *h. Следующий шаг было бы найти все варианты использования h и посмотреть, если они безопасны и если create_handler/destroy_handler правильно доминировать / пост-доминировать друг над другом. К сожалению, я понятия не имею, как перебрать использование h, кажется, что в классе ValueDecl такого интерфейса нет.

Буду признателен, если вы не подскажете, как мне найти все варианты использования переменная в AST, или укажите мне какой-нибудь основанный на лягушке инструмент, имеющий дело с подобной проблемой.

Спасибо!

1 Ответ

0 голосов
/ 29 июня 2018

Можно сопоставить declRefExpr s, ссылаясь на переменную (используя сопоставления AST). После этого ParentMap может использоваться для обхода AST в обратном направлении и поиска рекурсивных узлов AST, которые используют эти declRefExpr s. Помните, что обычно ParentMap создается не для всего AST, а только для поддерева (передаваемого в качестве параметра в конструктор).

...