首頁 >後端開發 >C++ >如何使用 LLVM 產生 C 程式碼呼叫圖?

如何使用 LLVM 產生 C 程式碼呼叫圖?

DDD
DDD原創
2024-11-16 10:59:03936瀏覽

How to Generate a Call Graph for C   Code Using LLVM?

為C 程式碼產生呼叫圖

為了發現特定函數的潛在執行路徑,特別是在手動識別不切實際的情況下,對於產生呼叫圖很有用。

使用LLVM 建立呼叫圖:

要使用LLVM(低階虛擬機)建立呼叫圖,請依照下列步驟操作:

  1. 使用-emit-llvm 選項編譯C 程式碼以產生LLVM 程式集:

    clang++ -S -emit-llvm main.cpp -o -
  2. 使用opt 分析程式集帶有-analyze 標誌的工具:

    opt -analyze main.ll
  3. 產生表示呼叫圖的DOT 檔案:

    opt -analyze -dot-callgraph main.ll
  4. 轉換DOT 檔案使用Graphviz 轉換為影像格式:

    dot -Tpng -o callgraph.png callgraph.dot
    轉換DOT 檔案使用Graphviz 轉換為影像格式:

此過程將產生呼叫圖的視覺化表示,顯示通往目標函數的所有路徑。

範例:

static void D() { }
static void Y() { D(); }
static void X() { Y(); }
static void C() { D(); X(); }
static void B() { C(); }
static void S() { D(); }
static void P() { S(); }
static void O() { P(); }
static void N() { O(); }
static void M() { N(); }
static void G() { M(); }
static void A() { B(); G(); }

int main() {
  A();
}

考慮以下C 程式碼:

使用上面概述的步驟,我們可以產生一個呼叫圖,其中顯示D () 所經過的所有可能路徑可以被呼叫。

    其他注意事項:
  • 對於具有大量呼叫路徑的複雜程式碼庫,可能需要使用以下工具對DOT 檔案進行後處理c filt 來取得人類可讀的函數名稱。
  • 預設情況下,opt 將假定存在外部函數,為了清晰起見,可以過濾掉或重新命名該函數。
確保目標函數未內聯以準確捕捉呼叫層次結構。

以上是如何使用 LLVM 產生 C 程式碼呼叫圖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn