2011-07-06 68 views
9

我需要預處理一些C++文件來測試和分析自動插入代碼,我需要與鐺API做到這一點。處理C++鏗鏘API函數來插入代碼

現在,我希望能夠做到以下幾點: 如果有一個函數:

int SomeFn(int a, int b, int c) { 
    doStuff(); 
} 

我想預處理它,它看起來像這樣:

int SomeFn(int a, int b, int c) { 
    cout << "SomeFn is invoked with the following arguments: a=" << a << ", b=" << b << ", c=" << c << endl; 
    doStuff(); 
} 

我一直試圖擴大ASTConsumer和使用方法HandleTopLevelDeclHandleTopLevelSingleDecl和檢查通過DeclsFunctionDecls喪氣他們,這樣我就可以得到他們的名字和身體位置。 但我無法處理類方法,只有全局函數。

我發現HandleTagDeclDefinition(TagDecl* D)ASTConsumer類的功能。文檔說:每次 TagDecl

此回調被調用(例如結構,聯合,枚舉類 )結束。

但是看起來這種方法甚至沒有被調用,當我測試它。

所以我的問題是,什麼是做這項工作的正確方法?以及C++類如何在clang API中表示?也許有人知道,我可以在哪裏找到示例,因爲clang API的記錄很差。


UPDATE:

我知道有也是Visitors的概念,有一個方法VisitRecordDecl(RecordDecl *D)。該文檔說RecordDecl表示類。所以我延長RecursiveASTVisitor實施VisitRecordDecl(RecordDecl *D),但現在看來,這種方法不會調用都不是。 相反VisitVarDecl被調用,當一個類定義是發現,因爲如果它被看作是一個變量聲明。 所以我有點困惑。我希望有人能夠幫助...


UPDATE2:

我試圖解析另一個文件,這一次鐺找到一個RecordDecl。但文件中定義一個struct和兩班,所以我覺得我的鐺代碼分析℃,而不是C++。在C和C++之間切換是否有任何設置

+5

「因爲叮噹API的記錄很差。」對於開源軟件,文檔相當不錯。有一個在http://clang.llvm.org/docs/UsersManual.html用戶手冊和API在由doxygen的在http://clang.llvm.org/doxygen/index.html自動生成。你還能想要什麼? –

+2

該手冊是爲編譯器,我不需要和doxygen的文檔是有幫助的,如果你知道如何鏗鏘的作品,但我不知道。 –

+0

本技術文件概述了可能在概念上更易於理解的非Clang方法:「簡化分支覆蓋」http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf分支覆蓋是一種測試覆蓋;本文討論如何使用相同的想法進行分析。 –

回答

10

是否有C和C++之間切換任何設置?

最後,我發現瞭如何處理這個問題:

我從ASTConsumerRecursiveASTVisitor<MyConsumer>擴展遍歷AST並實施VisitCXXRecordDecl(CXXRecordDecl* D)。然後我必須爲預處理器設置LangOptions參數,因此它解析了C++。

langOpts.CPlusPlus = 1; 

我的錯是認爲它會解析C++向右走,但情況並非如此,它解析C作爲默認設置,所以不承認階級。

1

我同意CLang的文檔可能在某些領域缺乏。不幸的是,這是Open Source的工作方式:直到有人需要它的時候纔會出現這種情況,數字出來後決定回饋他的發現。

對於您的具體問題,我建議您在Clang Dev郵件列表上發帖(或者從sifting through the archives開始)。關於ASTConsumers或其他變換分析的問題相當頻繁,通常會立即回答。

然後,當你學到的東西你要找的人,不要想升級的文件;)

3

我不知道爲什麼你想這樣做轉換上飛(如果我沒有理解你的權利)。這與在類定義的C++方法特別棘手,因爲原樣,如果他們的類外定義他們編譯(即,所有的類成員是可用的,即使是那些尚未聲明)。

無論如何,當你有一個RecordDecl,你可以通過field_begin訪問其成員。

很顯然,當你遇到nexted類,你需要列舉那些爲好。實際上,既然你可以在函數中的類中定義方法,你將需要幾乎在任何地方檢查嵌套聲明。

+0

那麼,如何得到一個'RecordDecl'?我想我必須從Decl貶低,但在哪個Handle方法? 'HandleTagDeclDefinition(TagDecl * D)'? –

+0

那麼,頂層decl將在頂層(你可以找到那些對嗎?),嵌套類可以在函數和其他類中找到它們。不知道lambda的,他們太新了。 – MSalters

+0

我實現了'VisitRecordDecl(RecordDecl * D)',但它根本沒有被調用,儘管在我的代碼中有一個類定義。相反'VisitVarDecl'被調用... –