Получить все вызванные функции (даже если вызваны другой функцией) libclang python - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь использовать libclang / python 3.7 для сбора каждой функции, вызываемой в программе, путем ее разбора в модуль перевода.Я анализирую файл main.cpp, чтобы собрать данные.

Testhead.cpp :

#include <testhead.h>
void a()
{
   std::cout<<5;
   b();
}
void b()
{
    std::cout<<6;
} 

Main.cpp :

#include "testhead.h"

//classtest ct;

int main()
{
  a();
  return 0;
}

OutPut : Я пытаюсь получить все вызовы функций, отмеченные CALL_EXPR, который дается только для функции a (), когда функция a () вызывает функцию b ()

Пример Python / libclang, используемый для получения вывода :

for i in node.get_children():
        if i.kind == clang.cindex.CursorKind.CALL_EXPR:
            print(str(i.kind)+","+i.spelling)
            #print(str(i.extent.start))
            tempSet.add(i.spelling)
        elif i.kind == clang.cindex.CursorKind.FUNCTION_DECL:
            print(str(i.kind)+","+i.spelling)
            #print(str(i.extent.start.file))
            for item in i.get_children():
                if item.kind == clang.cindex.CursorKind.CALL_EXPR:
                    tempSet.add(item.kind)
                    for n in item.get_children():
                        print(str(n.kind) +","+ n.spelling)
                        for z in n.get_children():
                            print(str(z.kind) +","+ z.spelling)
                elif item.kind == clang.cindex.CursorKind.COMPOUND_STMT:
                    print(' ' + str(item.kind) + ', ' + item.spelling)
                    #print(' ' + str(item.extent.start.file))
                    for c in item.get_children():
                        if c.kind == clang.cindex.CursorKind.CALL_EXPR:
                            print(' '*2 + str(c.kind) + ', ' + c.spelling+" , " + c.displayname)
                            #print(' '*2 + str(c.extent.start))
                            a = c.get_definition()
                            print(' '*10 + str(a))
                            tempSet.add(c.spelling)
                            for z in c.get_children():
                                print(' '*3 + str(z.kind) + ", "+ z.spelling)
                                a = z.get_definition()
                                print(' '*10 + str(a))
                                for x in z.get_children():
                                    print(' '*4 + str(x.kind) +","+ x.spelling)
                                    a = x.get_definition()
                                    print(' '*10 + str(a))
                                    for b in x.get_children():
                                        a = b.get_definition()
                                        print(' '*10 + str(a))
                                        print(' '*5 + str(b.kind) +","+ b.spelling)

Путем проб и ошибок, которые я обнаружил, я могу найти только вложенную функциювызовы внутри определений функций, которые определены в main.cpp.

, пока единственное решение, которое я нашел, - это то, что мне нужно иметь оператор включения для .h и .cpp, например:

#include <test.h>
#include <test.cpp>
main.cpp
..............

Однако у меня не будет доступа к .cpp, я буду использовать DLL

...