Я пытаюсь использовать 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