Получить все функции, вызываемые (даже если они вызваны другой функцией) libclang python
Я пытаюсь использовать 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;
}
Пример 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