北大軟體cobot(庫博)是具有自主智財權的靜態檢測工具。在2023年獲得了計算機軟體著作權,基於值依賴分析的c程式缺陷靜態檢測系統。很多同行對值依賴分析的概念可能不是太清楚,今天我們主要分析一下這個技術。
值依賴分析是建立在值流模型基礎之上的,值流模型最早由horwitz提出,值流圖中結點與結點之間的連線表示的是資料流分析中的定值使用關係。值流依賴表示由於定值-使用連線的依賴關係。值流依賴關係可以通過值依賴圖來表現。
value dependence graph(簡稱vdg),值依賴圖,是一種基於程式值依賴分析的、路徑敏感的空指標解引用檢測方法,主要分析守衛值依賴分析和非守衛值依賴分析。該方法通過結合資料流分析中的到達定值分析、區間分析及指向分析建立了值依賴分析圖,該圖刻畫了可能產生空指標語句到其解引用語句的值依賴關係.該圖中的邊採用守衛標註,即描述了相鄰點之間的到達條件,降低誤報率。
值依賴的邊連線兩個存在依賴關係值依賴結點。值依賴邊是有向邊,邊的頭結點被稱為定義結點,尾結點稱為使用結點。定義結點和使用結點中分別存在乙個導致依賴關係的變數,分別稱為定義變數和使用變數。此外,值依賴邊還儲存了定義結點和使用結點之間的到達條件。
康奈爾大學cherem等人對值流模型進行完善,在值流模型的邊上增加約束表示式,以此來表達相鄰結點之間的可達條件。擴充套件後的值流模型應用於記憶體洩漏的缺陷檢測,將程式分析問題規約為邏輯的問題,通過約束求解器來判斷缺陷是否可能發生。
基於改進後的值流模型有一款缺陷檢測工具fastcheck,其基本流程是:第一步,通過前端構建的待測程式的控制流圖。第二步,通過標準的資料流分析程式的定值使用關係。第三步,根據定值使用分析的結果,輔以指向分析的資訊,構建直流圖。第四步,以此進行無守衛的值流分析和基於守衛的值流分析。最後,綜合值流分析結果和布林可滿足求解器sat的結果,給出缺陷報告。
新南威爾斯大學的yulei等人對值流模型進一步改進、利用流敏感、上下文敏感的指向分析技術,通過分析數值型變數和非巢狀指標的靜態單賦值形式表示的定製使用關係,建立全稀疏直流圖。
值依賴分析技術以程式源**作為輸入、採用資料流分析、指向分析、區間分析等多種分析技術給出每個變數的值的依賴關係,並以此為基礎構建程式表達模型。值依賴分析方法是一種解決跨函式問題的靜態分析求精技術,它改進了值流模型的不足,使得模型表達語義更加豐富,模型表達能力更加強大,從而使分析結果更加準確。
值流模型仍然存在著下面問題:
無法表達指標操作的***;
無法表達數值型變數的定製使用關係;
無法表達陣列、結構體以及解引用之間的定值使用關係。
因此北京大學的馬森博士對值流模型進行優化和改進,將改進後的模型成為值依賴模型。
通過對程式中所有語句進行定值使用關係的分析,為程式**現的變數(包括指標型和數值型)建立值依賴關係,改善了模型對陣列、解引用、結構體等資料結構的表達;
通過部分定值概念的引入支援結構體對其域的影響;
通過計算值依賴模型中的守衛條件,表達定值節點所處分支的條件;
通過優化原有的守衛計算演算法,降低複雜度使其可應用於大規模工程檢測;
通過區間分析、指向分析等多種靜態分析技術的引入、增強模型的表達能力,從而值依賴模型可以正確地表達別名指針對變數取值的影響。
值依賴模型的構建方法如下圖:
第一步:初步構建值依賴圖,根據到達定值分析得到的變數間的使用關係,在結點之間新增依賴邊,但增加了對結構體域、解引用、陣列的處理。
第二步:值依賴的守衛構建。通過控制流分析計算結點之間的可達條件,標註在相應的邊上。
第三步:值依賴圖的精化構造。根據指向分析結果完善指針對變數值流的影響;根據區間分析移除事實上不可能存在的值依賴邊;通過常量擴充套件、常量摺疊的技術,簡化值依賴邊上的守衛資訊。
值依賴模型的結點有如下幾種型別:
賦值結點:對於形如x=y的函式賦值語句,值依賴模型建立乙個反應該語句語義的賦值結點。此外,對於存在右值的形如s var=e的宣告語句,值依賴模型也建立乙個反應該語句語義的賦值結點。
宣告結點:對於不存在右值的形如s var的宣告語句,值依賴模型建立乙個反映該語句語義的宣告結點。
函式返回結點:對於形如return e的函式返回語句,值依賴模型建立乙個反映該語句語義的函式返回結點。
實參結點:對於形如e=f(p1,p2,…pn)的函式呼叫語句,值依賴模型對每個引數pi建立乙個實參結點pi@e= f(p1,p2,…pn)
形參結點:對於形如e=f(p1,p2,…pn)的函式呼叫語句,根據函式呼叫圖,找到被調函式的函式宣告f(fp1,fp2,…fpn),對於每個形參fpi建立乙個形參結點,並從實參結點向對應形參的形參結點連線值依賴邊。
值依賴入口結點:值依賴模型擁有唯一的值依賴入口結點。該結點的作用是,對於其他的原本沒有前驅的值依賴結點n,若從程式入口到n存在不為真的達到條件,則從值依賴入口結點向n連線一條值依賴邊。邊上的守衛為程式入口到n的條件。
分支語句結點:對於每條條件分支語句,值依賴模型建立乙個反映該語句語義的分支語句結點。
成員方法呼叫結點:該結點與實參結點類似,區別在於成員方法呼叫結點處理實參在物件上的方法呼叫。
構造器引數結點:對於形如c(p1,p2,…pn)的構造器語句,值依賴模型對每個引數pi建立乙個構造引數結點pi@ c(p1,p2,…pn)。
下面是乙個通過cobot工具生成的vdg圖。
更多資訊請諮詢庫博技術。
(完)
專案績效分析方法 掙值技術
專案績效分析方法 掙值技術 目前的專案狀況如下 p 總預算是150w人民幣 工作量為12個月 10個可交付產品 p 報告狀況 到目前的支出 80w人民幣 交付的產品 4個完成,3個部分完成 那麼如何評估這個專案的績效呢?在現實情況中我們很多都只能把專案做完後才能得出答案,其實不然,我們有如下方法來對...
Vue依賴更新原理分析
依賴更新分為兩步 修改屬性值 通知之前收集到的依賴,進行更新 dep主要用來儲存依賴 var dep function dep.prototype.notify function 那watcher.update中到底發生了什麼?可以來具體看一下watcher類的原始碼 function watche...
小記 spark的寬依賴與窄依賴分析
窄依賴 narrow dependency 乙個rdd對它的父rdd,只有簡單的一對一的依賴關係。rdd的每個partition僅僅依賴於父rdd中的乙個partition,父rdd和子rdd的partition之間的對應關係是一對一的。寬依賴 shuffle dependency 本質就是shuf...