最新消息

[專欄]JetBrains 部落格 / Anastasia Kazakova 專欄 - 爭取更好的 C++ 程式碼第二部分:加速資料流分析的函數摘要

2024/01/22

[專欄]JetBrains 部落格 / Anastasia Kazakova 專欄 - 爭取更好的 C++ 程式碼第二部分:加速資料流分析的函數摘要

原文由 Anastasia Kazakova 於 2023 年 12 月 1 日發布

資料流分析中引入函數摘要(Introducing function summaries in data flow analysis)
在 CLion 2023.3 預覽版中,我們徹底重新設計了 CLion 的 DFA,使分析更快、更準確。我們實作了一種稱為函數摘要方法(function summaries approach),它使我們能夠區分任意巢狀呼叫鏈的不同函數上下文,從而實現更準確的分析。讓我們看看這是如何完成的。

在先前的 CLion 版本中,我們的 DFA 已經是跨過程的。 它透過函數的參數和返回值處理函數呼叫和資料流。對於每個函數,它形成了由函數呼叫網站定義的幾個「外部」上下文。 這意味著給定函數的所有呼叫站點都會受到不同的處理。儘管該方法確實比上下文不敏感分析(不考慮呼叫站點)具有更高的精度,但它有幾個缺點。

首先,僅處理深度為 1 的上下文。如果您從另一個函數 B 呼叫函數 A,然後從多個呼叫網站呼叫函數 B,它們的上下文將合併,導致準確性損失:


目前的函數摘要方法使用內部上下文而不是外部。這些內部上下文是由函數本身而不是其被呼叫者定義的。如果函數依賴某些輸入值(參數、全域變數、欄位或這些輸入值的條件),則它具有多個上下文 - 每個輸入一個。例如,下列函數有兩個上下文,一個用於 c.x > 10,另一個用於 c.x <= 10


這些上下文不依賴函數的呼叫站點,並且完整地描述了函數的語義。函數在不同上下文中的行為通常稱為函數摘要。函數摘要的引入幫助我們使分析更快、更精確。

採用這種方法也使我們能夠支援分析中的欄位。現在,每個函數摘要都會追蹤哪些欄位是輸入,哪些欄位是輸出,因此程式的堆疊現在可以更精確地建模。

所有描述的變化使我們的分析真正實現了過程間分析,同時表現更高。為了展示 CLion 中新分析的強大功能,讓我們來看看以下範例:

 
所有現有的分析也受益於這些變化。數組索引越界檢查現在處理透過欄位和參數傳遞的數組,空取消引用、常數條件和其他檢查也是如此。 還有一個名為字段未初始化的新檢查,它跟踪其值在使用前未初始化的字段:


以上資料來源來自:JetBrains 部落格 / Anastasia Kazakova 專欄 / Striving For Better C++ Code, Part II: Function Summaries to Speed Up the Data Flow Analysis

Anastasia Kazakova 部落格:https://blog.jetbrains.com/author/anastasia-kazakova/
.立即試作:https://www.jetbrains.com/clion/download/download-thanks.html?platform=windows

購買/續約:https://www.ahasoft.com.tw/page/product/show.aspx?num=112&kw=CLion&page=1&lang=TW