發布 ControlFlag 1.0,用於識別 C 代碼錯誤的工具

英特爾發布了 ControlFlag 1.0 工具的第一個主要版本,該工具允許您使用經過大量現有程式碼訓練的機器學習系統來識別原始程式碼中的錯誤和異常。 與傳統的靜態分析器不同,ControlFlag 不會應用現成的規則,很難提供所有可能的選項,而是基於對大量現有項目中各種語言結構的使用情況進行統計。 ControlFlag 程式碼是用 C++ 編寫的,並在 MIT 許可證下開源。

該系統透過建立 GitHub 和類似公共儲存庫中發布的開源專案的現有程式碼數組的統計模型來進行訓練。 在訓練階段,系統會確定在程式碼中建立結構的典型模式,並建立這些模式之間連接的語法樹,反映程式中程式碼執行的流程。 結果,結合了所有分析的原始程式碼的開發經驗,形成了參考決策樹。 正在審查的程式碼經歷了類似的識別模式的過程,並根據參考決策樹進行檢查。 與相鄰分支的較大差異表示正在檢查的模式中存在異常。

發布 ControlFlag 1.0,用於識別 C 代碼錯誤的工具

作為 ControlFlag 功能的範例,開發人員分析了 OpenSSL 和 cURL 專案的原始程式碼:

  • 異常構造「(s1 == NULL) ∧ (s2 == NULL)」和「(s1 == NULL) | (s2 == NULL)" ,與常用模式 "(s1 == NULL) || 不匹配(s2 == NULL)」。 程式碼也辨識了表達式「(-2 == rv)」(減號是拼字錯誤)和「BIO_puts(bp, “:”) <= 0)」中的異常(在檢查是否成功完成函數應該是“== 0”)。
  • 在cURL中,當使用結構元素「s->keepon」時,發現了靜態分析器未偵測到的錯誤,該結構元素具有數字類型,但與布林值TRUE進行比較。

ControlFlag 1.0版本的功能包括完全支援C語言的標準模板以及檢測條件「if」表達式中的異常的能力。 例如,在分析程式碼片段「if (x = 7) y = x;」時系統會判斷「if」語句通常使用「變數==數字」結構來比較數值,因此「if」表達式中的「變數=數字」很可能是由拼字錯誤造成的。 該套件包含一個腳本,可讓您下載 GitHub 上現有的 C 語言儲存庫並使用它們來建立模型。 也提供現成的模型,讓您可以立即開始檢查程式碼。

來源: opennet.ru

添加評論