0

libclang を使用して C++ の名前空間関数の本体を解析できません。

次のような名前空間にクラスがあります。

namespace outer {
    namespace inner {
        class MyClass {
            public:
                short myMethod(){
                    return NTOHS(10);
                }

                short anotherMethod();
        };

        short MyClass::anotherMethod(){
            return NTOHS(11);
        }

        short myFunction(){
            return NTOHS(12);
        }
    }
}

libclang の Python ラッパーを使用すると、再帰によって各ノードを見つけることができます。

def find_node(node):
    print node  # Just print stuff about the node (spelling, location, etc.)
    for child in node.get_children():
        find_node(child)

myMethodおよびで NTOHS の使用を検出し、myFunctionそれらのノードに関する情報を出力できますが、 では検出できませんMyClass::anotherMethod

他の誰かが同様の問題に遭遇しましたが、解決されていないようです。

ここでの NTOHS は、ネットワークをホストの順序に変換するための linux/unix コマンドです。

libclang を使用して名前空間関数で NTOHS を検出するにはどうすればよいですか?

4

1 に答える 1

0

この問題は、質問にない情報に関連している可能性があり、使用しているプラ​​ットフォームとバージョンのclang、およびNTOHS参照しているバージョンに依存している可能性があると思われます.

OSX Yostemite では、NTOHS次のように定義されています。

#define NTOHS(x)    (x) = ntohs((__uint16_t)x) 

サンプルをコンパイルするためにも、一時的なものを導入する必要がありました。

Ubuntu 14.04 では、 にNTOHSはありませんが/usr/includentohs次のように定義されています。

#define ntohs(x)        __bswap_16 (x)

サンプルをコンパイルするには、に切り替える必要がありましたntohs

完全を期すために、Ubuntu 14.04 では、次のサンプルを使用しました。

#include <netinet/in.h>

namespace outer {
    namespace inner {
        class MyClass {
            public:
                short myMethod(){
                    return ntohs(10);
                }

                short anotherMethod();
        };

        short MyClass::anotherMethod(){
            return ntohs(11);
        }

        short myFunction(){
            return ntohs(12);
        }
    }
}

そして、このツリーをclang 3.7から取得しましたhttp://llvm.org/apt/trusty/(libclangのインクルードパスを設定した後)

TRANSLATION_UNIT sample.cpp
  +--NAMESPACE outer
     +--NAMESPACE inner
        +--CLASS_DECL MyClass
        |  +--CXX_ACCESS_SPEC_DECL
        |  +--CXX_METHOD myMethod
        |  |  +--COMPOUND_STMT
        |  |     +--RETURN_STMT
        |  |        +--UNEXPOSED_EXPR ntohs
        |  |           +--CALL_EXPR ntohs
        |  |              +--UNEXPOSED_EXPR ntohs
        |  |              |  +--DECL_REF_EXPR ntohs
        |  |              +--UNEXPOSED_EXPR
        |  |                 +--INTEGER_LITERAL
        |  +--CXX_METHOD anotherMethod
        +--CXX_METHOD anotherMethod
        |  +--TYPE_REF class outer::inner::MyClass
        |  +--COMPOUND_STMT
        |     +--RETURN_STMT
        |        +--UNEXPOSED_EXPR ntohs
        |           +--CALL_EXPR ntohs
        |              +--UNEXPOSED_EXPR ntohs
        |              |  +--DECL_REF_EXPR ntohs
        |              +--UNEXPOSED_EXPR
        |                 +--INTEGER_LITERAL
        +--FUNCTION_DECL myFunction
           +--COMPOUND_STMT
              +--RETURN_STMT
                 +--UNEXPOSED_EXPR ntohs
                    +--CALL_EXPR ntohs
                       +--UNEXPOSED_EXPR ntohs
                       |  +--DECL_REF_EXPR ntohs
                       +--UNEXPOSED_EXPR
                          +--INTEGER_LITERAL
于 2016-02-25T12:52:55.880 に答える