AST generado por el enlace python de Libclang que no puede analizar ciertos tokens en códigos fuente de C ++

Estoy usando el enlace de python de Libclang. Tengo básicamente dos consultas:

  1. Quiero saber cómo podemos analizar una función de biblioteca que no está definida por el usuario ni para la que se ha incluido una biblioteca. Por ejemplo, cuando tengo el siguiente código fuente:

    char* a=(char *)malloc(4); 
    • Libclang no puede analizar malloc () porque no se ha incluido ni stdlib en este código ni se ha proporcionado una definición definida por el usuario para malloc.
  2. Un objeto no definido utilizando un constructor no es reconocido por el AST de Libclang. Por ejemplo, en el código fuente –

     vector color; color.push_back(1); color.push_back(2); 

Las declaraciones push_back () no se analizarán, pero cuando se escriben así:

  vector color=new vector(); color.push_back(1); color.push_back(2); 

analiza correctamente.

    • Otra manifestación sorprendente de este comportamiento es cuando tales objetos se pasan como parámetros de función a una función definida por el usuario. Por ejemplo

       bool check(int **grid, vector color){ color.push_back('a'); } 

    push_back () aún no está identificado, pero cuando se escribe esto, las cosas se analizan correctamente

      bool check(int **grid, vector color, int anc, int cur){ vector color = new vector() color.push_back('a'); 

    Sería genial si alguien es capaz de sugerir una solución. Tal vez hay una bandera que cuando se establece es capaz de evitar esto?

    Necesitas añadir el siguiente argumento.

    -x c ++ -std = c ++ 11

    cuando se llama a parse, de lo contrario, se analiza de forma predeterminada el código C para los archivos .h. Puede cambiar el nombre del archivo de encabezado a .hpp

    Así es como se ve mi guión de ayuda.

     from cindex import * def get_cursor_from_file(filename,my_args=[]): index = Index.create() options = TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD file_obj = index.parse(filename,args=my_args,options=options) for i in file_obj.diagnostics: print i return file_obj.cursor x = get_cursor_from_file('test.cpp') for c in x.get_children(): print c.spelling 

    El archivo fuente que probé se ve así

     #include  using namespace std; int main(){ char* a=(char *)malloc(4); vector color; vector *color2=new vector(); color.push_back(1); color.push_back(2); } bool check(int **grid, vector color){ color.push_back('a'); }