CodeQL 如何分析程式碼?

已完成

使用 CodeQL 實作程式碼掃描需要了解工具如何分析程式碼。

CodeQL 分析包含三個步驟:

  1. 藉由建立 CodeQL 資料庫來準備程式代碼。
  2. 對資料庫執行 CodeQL 查詢。
  3. 解譯查詢結果。

在本單元中,您將了解 CodeQL 分析的三個階段。

資料庫建立

為了建立資料庫,CodeQL 會先擷取程式碼基底中每個原始程式檔的單一關聯式標記法。

針對編譯語言,擷取的運作方式是監視正常的編譯過程。 每次叫用編譯器來處理原始程式檔時,都會建立該檔案的複本,並收集原始程式碼的所有相關資訊。 這包括關於抽象語法樹狀結構的語法資料,以及有關名稱繫結和類型資訊的語意資料。

針對解譯的語言,擷取器會直接在原始程式碼上執行,並解析相依性,以正確表示程式碼基底。

CodeQL 支援的每個語言都有一個擷取器,以確保擷取程式盡可能精確。 針對多語言程式碼基底,資料庫一次會產生一種語言。

擷取之後,分析所需的所有資料 (關聯式資料、複製的來源檔案和語言特定資料庫架構,該架構指定資料相互關聯) 會匯入單一目錄,稱為 CodeQL 資料庫。

查詢執行

建立 CodeQL 資料庫之後,會對其執行一或多個查詢。 CodeQL 查詢以特別設計的物件導向查詢語言撰寫,該語言稱為 QL。

您可以使用 CodeQL for VS Code 擴充功能或 CodeQL CLI,執行從 CodeQL 存放庫取出的查詢(或您自行撰寫的自定義查詢)。

查詢結果

最後一個步驟會將查詢執行期間所產生的結果轉換成在原始程式碼內容中更有意義的表單,這表示結果會以一種突顯設計查詢以尋找潛在問題的方式來進行解釋。

CodeQL 查詢結果的螢幕擷取畫面。

查詢包含中繼資料屬性,指出應該如何解譯結果。 例如,某些查詢會在程式碼的單一位置顯示簡單的訊息。 其他項目會顯示一連串的位置,代表資料流或控制流步驟,並附上解釋結果意義的訊息。 沒有元數據的查詢不會解譯;其結果會輸出為數據表,而不會顯示在原始程式碼中。

在解譯完成後,會產生程式碼檢閱和分類的結果。 解譯的查詢結果會自動顯示在 Visual Studio Code 的 CodeQL 原始程式碼中。 您可以將 CodeQL CLI 產生的結果輸出為多種不同的格式,以搭配不同的工具使用。