2010-03-11 81 views
4

我們希望對用戶的C++代碼進行一些相當簡單的分析,然後使用該信息來測試代碼(基本上用一些工具代碼重新生成代碼),以便用戶可以運行動態分析他們的代碼並獲取某些數值類型值的範圍等數據。使用clang分析C++代碼

clang應該能夠處理足夠的C++來處理我們的用戶會投擲的代碼類型 - 而且由於clang的C++覆蓋率在我們完成之後會不斷提高,所以它會更好。

那麼,人們如何使用這樣的clang作爲獨立的解析器呢?我們認爲我們可以生成一個AST,然後走它尋找我們感興趣跟蹤的類的對象。會有興趣聽到別人在沒有使用LLVM的情況下使用clang。

回答

1

clang被設計爲模塊化。從它的頁面引用:

的鐺的主要設計理念是 其採用了基於庫的 架構。在這種設計中,前端的各個部分可以乾淨地劃分成單獨的庫,然後 然後可以混合用於不同的需求和使用。

看看鐺圖書館像libast爲您的需求。閱讀更多here

1

你沒有註明的是你想要做什麼樣的「分析」。大多數C++分析都要求你有準確的符號表數據,這樣當你遇到符號foo時,你有一些想法是什麼。 (你在技術上甚至不知道什麼+沒有這樣的符號表!)你也需要泛型類型信息;如果你有一個表達式「a * b」,結果的類型是什麼?擁有「名稱和類型」信息幾乎是任何你想做的分析的關鍵。

如果你堅持叮噹,那麼這裏還有其他答案。我不知道它提供了名稱和類型解析。

如果您需要需要名稱和類型分辨率,那麼另一種解決方案是DMS Software Reengineering Toolkit。 DMS爲分析,分析,轉換和解析(從編譯器數據結構中重新生成源代碼)提供了類似編譯器的編譯器。 DMS的工業強度C++前端(它也有許多其他語言前端)根據ANSI標準以及GCC和MS VC++方言提供全名和類型解析。

代碼轉換可以通過DMS提供的抽象語法樹接口實現,也可以通過用目標語言(本例中爲C++)的表面語法編寫的模式定向程序轉換規則來實現。這裏有一個使用規則語言的簡單轉換:

domain Cpp~GCC3; -- says we want patterns for C++ in the GCC3 dialect 

    rule optimize_to_increment(lhs:left_hand_side):expression -> expression 
     " \lhs = \lhs + 1 " -> " \lhs++" if no_side_effects(lhs). 

這隱式地運行在DMS構建的AST上,以修改它們。有條件的 允許您查詢模式變量的任意屬性(在本例中爲lhs),包括名稱和類型約束(如果您希望的話)。

DMS已被多次用於非常複雜的程序分析和C++代碼轉換。我們使用DMS以相當明顯的方式構建C++代碼,從而構建C++測試覆蓋工具。在網站上,有一篇文章描述了DMS如何用於重構軍用飛機任務軟件的大型產品線的架構。這種活動通過應用大量的模式定向轉換(如上所述),將C++以一種體系結構形式注入另一種體系結構中。

這可能很容易實現你的儀器。而且你不必等待它成熟。

+2

我傾向於認爲clang必須提供名稱和類型解析信息 - 他們還要如何編譯到LLVM並提供有用的錯誤消息(在這一點上比gcc更有用)。 – aneccodeal 2010-03-11 05:51:29

+0

當然,clang-the-compiler有某種符號表。它是否可用AST以便利的形式?鏗鏘編譯器甚至構建完整的AST?它是否可以同時用於多個編譯單元?如果我正在設計這樣一個工具(並且已經完成了DMS),我會怎麼做,但這不同於他們實際做的。我只是不知道。 – 2014-07-07 20:07:02