0

私はLibclangのpythonバインディングを使用しています。基本的に2つのクエリがあります:

  1. ユーザーによって定義されておらず、ライブラリが含まれていないライブラリ関数を解析する方法を知りたい..たとえば、次のソースコードがある場合–

     char* a=(char *)malloc(4);
    
    • libclang は malloc( ) を解析できません。これは、stdlib がこのコードに含まれておらず、malloc に対してユーザー定義の定義が提供されていないためです。
  2. コンストラクターを使用して定義されていないオブジェクトは、Libclang の AST によって認識されません。たとえば、ソースコードでは -

    vector<int> color;
    color.push_back(1);
    color.push_back(2);
    

push_back( ) ステートメントは解析されませんが、次のように記述した場合:

        vector<int> color=new vector<int>();
        color.push_back(1);
        color.push_back(2);

正しく解析されます。

  • この動作のもう 1 つの驚くべき兆候は、そのようなオブジェクトが関数パラメーターとしてユーザー定義関数に渡される場合です。例えば

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

push_back( ) はまだ識別されていませんが、これが記述されると、物事は正しく解析されます

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

誰かが回避策を提案できれば素晴らしいでしょう。おそらく、設定時にこれを回避できるフラグがありますか?

4

1 に答える 1

0

次の引数を追加する必要があります

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

parse を呼び出すとき、それ以外の場合はデフォルトで .h ファイルの C コードを解析します。ヘッダー ファイルの名前を .hpp に変更できます。

ヘルパー スクリプトは次のようになります。

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

テストしたソースファイルは次のようになります

#include <vector>
using namespace std;
int main(){
 char* a=(char *)malloc(4);
 vector<int> color;

 vector<int> *color2=new vector<int>();
 color.push_back(1);
 color.push_back(2);
}

bool check(int **grid, vector<char> color){
    color.push_back('a');
}
于 2014-08-18T20:38:59.833 に答える