0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探討一下基于符號抽象的程序分析

jf_glM2sZ6i ? 來源:編程語言Lab ? 2022-12-30 14:29 ? 次閱讀

軟件已經(jīng)無處不在,軟件質(zhì)量問題也越來越普遍,其造成的系統(tǒng)崩潰、安全漏洞等可能帶來經(jīng)濟上的損失,甚至威脅我們的生命。程序分析是保障軟件質(zhì)量的基礎(chǔ)技術(shù)和重要手段,已被廣泛應(yīng)用于提高軟件的可靠性、安全性、性能等多個維度的質(zhì)量。

今天,我們探討一類特殊的程序分析方法,基于符號抽象的程序分析。首先我會簡單回顧一下 抽象解釋 —— 靜態(tài)分析的核心理論。抽象解釋的核心問題之一是,計算程序狀態(tài)在給定抽象域內(nèi)的最佳抽象。針對這個問題,我會介紹符號抽象框架以及幾個和符號抽象有關(guān)的其他話題

# 抽象解釋 #

抽象解釋是靜態(tài)分析的核心理論 [1],其關(guān)鍵想法是對程序的可達狀態(tài)做一個上近似。

如下圖,假設(shè)左邊的黃色橢圓代表程序的可達狀態(tài) Reachable States,右邊的黃色橢圓代表有缺陷的狀態(tài) Bad States。我們想驗證這個程序是否有缺陷,即 Reachable States 是否可能和 Bad States 相交。

a5766db4-77bf-11ed-8abf-dac502259ad0.png

靜態(tài)分析可以對程序的可達狀態(tài)做推理,比如算出一個紅色區(qū)域。最終紅色區(qū)域可以完全覆蓋左邊的黃色區(qū)域,因此我們得到了一個上近似。而且我們看到左邊紅色區(qū)域和 Bad States 并不相交,因此我們成功地驗證了這個程序是安全的。

# 1.1 抽象解釋的應(yīng)用

過去 20 多年來,抽象解釋在工業(yè)界得到了很多應(yīng)用,以下三個可能是比較有代表性的。

第一個是 Astrée,基于數(shù)值域抽象解釋,已經(jīng)成功用于驗證航空航天等安全攸關(guān)場景的軟件。

第二個是 TVLA,主要做形態(tài)分析,比如驗證垃圾回收算法是否真的回收了內(nèi)存垃圾。TVLA 把形態(tài)分析這個概念給發(fā)揚光大了,啟發(fā)了很多后續(xù)工作,比如基于分離邏輯的形態(tài)分析。

第三個是 CodeSurfer/x86,它提出的 Value Set Analysis (VSA) 已經(jīng)成為了二進制靜態(tài)分析框架的標配。

a5897e04-77bf-11ed-8abf-dac502259ad0.png

此外,抽象解釋在學(xué)術(shù)領(lǐng)域也獲得多個榮譽,包括 2013 年 SIGPLAN 的程序語言成就獎, 2018 年的約翰·馮諾依曼獎等。

# 1.2 抽象域及其要素

抽象解釋會通過抽象域來對程序的狀態(tài)做數(shù)學(xué)近似,比如數(shù)值域、堆域、字符串域等。其中,數(shù)值域可以用來捕捉程序的數(shù)值信息,用于查找不同的程序缺陷,包括除零錯誤、整數(shù)溢出等。

a5c1dbe6-77bf-11ed-8abf-dac502259ad0.png

a5d2ccee-77bf-11ed-8abf-dac502259ad0.png

由于抽象解釋是對程序的可達狀態(tài)做上近似,它往往伴隨著一些精度問題。比如我們再次看這個圖,右邊的黃色區(qū) Bad States 和紅色區(qū)域 (靜態(tài)分析的結(jié)果) 是相交的,但事實上 Bad States 和左邊的黃色區(qū)域 Reachable States 并不相交,因此我們的靜態(tài)分析存在誤報。

a5e4635a-77bf-11ed-8abf-dac502259ad0.png

# 1.3 最佳抽象

給定一個抽象域比如區(qū)間域,怎么計算程序在該抽象域上的、最精確的上近似呢?事實上,這也是抽象解釋理論的一個核心問題:給定一個具體遷移函數(shù) 以及抽象域 ,如何得到 在 上的最佳抽象 (最精確的抽象遷移函數(shù))?

抽象解釋理論對 有一個聲明式的定義,但是這個定義是“非構(gòu)造性”的。通常我們沒有自動化的算法,去應(yīng)用最佳抽象遷移函數(shù) ,或者去得到 的一個表示。

最佳抽象的形式化定義:

a5f9f9fe-77bf-11ed-8abf-dac502259ad0.png

# 符號抽象框架 #

為了解決以上問題,研究人員提出了符號抽象框架。

# 2.1 框架定義和實例

假設(shè)我們用邏輯約束φ來編碼一個程序的具體狀態(tài),并且把抽象域看作一個比較受限的邏輯片段 (比如“區(qū)間邏輯”)。符號抽象的目標就是找到約束φ 在抽象域上的、最精確的上近似[2]。

a625c764-77bf-11ed-8abf-dac502259ad0.png

我們也可以從邏輯的角度來理解 [3]。給定一個約束φ和一個邏輯片段(對應(yīng)于抽象域), 找到約束φ在中的最強邏輯后承 (strongest logical consequence)。

a6525978-77bf-11ed-8abf-dac502259ad0.png

下面是一個具體的例子:

考慮約束 φ,其中是整數(shù)變量。這個約束有四個可行解。我們可以一眼看出,約束φ在區(qū)間域的最佳近似是。但是,在一般情況下,我們應(yīng)如何計算出一個約束的最佳區(qū)間近似呢?這就是符號抽象需要解決的問題。

a67935fc-77bf-11ed-8abf-dac502259ad0.png

# 2.2 框架意義和應(yīng)用

通常,為了實現(xiàn)一個靜態(tài)分析器,我們需要建模不同的程序指令 (比如加減乘除),為其設(shè)計不同的抽象遷移函數(shù)、并將這些遷移函數(shù)組合起來。而使用符號抽象框架后,我們就可以用一個約束來精確編碼一整塊代碼,并且自動得到對于該代碼的最精確近似。

a68eb5f8-77bf-11ed-8abf-dac502259ad0.png

符號抽象的理論和實際意義

然而,由于符號抽象的性能問題,目前在真實的靜態(tài)分析器中很少得到應(yīng)用。當(dāng)前的少量應(yīng)用主要包括兩塊。

一是上層源代碼的驗證分析,包括數(shù)值屬性、堆屬性等的驗證。對于數(shù)值驗證,國防科大的陳立前教授就有相關(guān)工作 [4]。目前這些工作主要面向一些相對小規(guī)模的程序驗證。

a6a8080a-77bf-11ed-8abf-dac502259ad0.png

其次是二進制分析,比如做控制流恢復(fù) control flow recovery 等。在歐洲有幾個團隊一直有做相關(guān)的工作,GrammaTech 甚至已經(jīng)將符號抽象用到二進制分析產(chǎn)品中。

a6c0d3c6-77bf-11ed-8abf-dac502259ad0.png

但即便有工業(yè)級應(yīng)用,符號抽象在形式化、編程語言、甚至抽象解釋社區(qū)也都還不夠普及。

# 延伸思考 #

下面分享一些引申思考?;氐椒柍橄蟮亩x: 是表達力豐富的邏輯,抽象域 對應(yīng)于 一個子集 。給定 ,找到它在 的最強邏輯后承。

其實計算機科學(xué)中的很多問題都跟這個問題相關(guān),下面我們舉幾個例子。

第一個是謂詞抽象 predicate abstraction [5],它可以看作符號抽象的一個特殊實例。假設(shè)我們有一些謂詞集合

,

謂詞抽象的抽象域 就是 中命題的任意布爾組合,比如 。在用于程序驗證時,結(jié)合一些不動點迭代方式,我們還能算出 能表達的最強循環(huán)不變式。

a6dd62de-77bf-11ed-8abf-dac502259ad0.png

第二個是量詞消去 quantifier elimination。給定,假設(shè)抽象域是只使用特定約束變量集合的約束。那么,存在量詞消去existential quantifier elimination 的目標就是計算在中的最強邏輯后承。

a70bf8f6-77bf-11ed-8abf-dac502259ad0.png

第三個是人工智能里面的 Forgetting 問題 [6],和量詞消去問題類似。這是港科大 Fangzhen Lin 教授發(fā)明的概念,在邏輯 AI 領(lǐng)域很有名。

第四個是 線性規(guī)劃 問題,它也可以看作符號抽象問題的一個實例。 即線性約束集合, (其中, 是線性目標函數(shù))。

個人認為符號抽象問題有超越靜態(tài)分析、編程語言,甚至超越計算機科學(xué)領(lǐng)域的意義,具有深遠的理論蘊含。而且針對相關(guān)問題的算法也有一些共通性,比如基于模型的泛化等。

# 總結(jié)與展望 #

最后,我們一起從 程序合成 的視角來理解符號抽象 (程序合成是指如何自動從規(guī)約中生成程序)。那么,回顧今天的主題,我們的規(guī)約是什么?我們應(yīng)如何從這個規(guī)約中生成靜態(tài)分析器呢?

a73f05de-77bf-11ed-8abf-dac502259ad0.png

a74ffd62-77bf-11ed-8abf-dac502259ad0.png




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • VSA
    VSA
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    10763
  • 分析器
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    12470

原文標題:基于符號抽象的程序分析

文章出處:【微信號:編程語言Lab,微信公眾號:編程語言Lab】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請教一下這個符號是什么

    請教一下這個符號是什么呀?由于很少使用這個符號,同時在multisim12的庫中沒有找到這個元件。
    發(fā)表于 06-13 12:37

    探討一下,CRC校驗的優(yōu)勢

    本帖最后由 ntmusic 于 2014-6-11 11:31 編輯 探討一下,使用計算的2字節(jié)的CRC校驗碼和使用固定的2字節(jié)數(shù)據(jù)作為校驗在保證數(shù)據(jù)傳輸正確方面有什么不同?
    發(fā)表于 06-11 11:21

    電器符號誰幫我解釋一下

    本帖最后由 yangkel2013 于 2015-1-9 12:51 編輯 我這邊有本電路圖,是英國進口的拌合站的電器圖,有些電氣符號不明白,誰能幫我解釋說明一下,先汗顏一下,我是新手FAR
    發(fā)表于 01-09 12:32

    麻煩大佬看一下電路模塊的符號代表什么?

    小白想請大佬看一下電路模塊的符號代表什么?
    發(fā)表于 06-22 07:06

    菜鳥想問一下怎么用個模型生成個器件符號?。?/a>

    想問一下怎么用個模型生成個器件符號???
    發(fā)表于 06-25 06:58

    探討一下深度學(xué)習(xí)在嵌入式設(shè)備上的應(yīng)用

    下面來探討一下深度學(xué)習(xí)在嵌入式設(shè)備上的應(yīng)用,具體如下:1、深度學(xué)習(xí)的概念源于人工神經(jīng)網(wǎng)絡(luò)的研究,包含多個隱層的多層感知器(MLP) 是種原始的深度學(xué)習(xí)結(jié)構(gòu)。深度學(xué)習(xí)通過組合低層特征形成更加
    發(fā)表于 10-27 08:02

    分析探討

    分析探討 首先提一下分析的概念哈,我們可以用各種手段完成,包括仿真軟件,手算,實際測試等等,器件發(fā)熱會導(dǎo)致很多問題:1.半導(dǎo)體
    發(fā)表于 11-21 14:07 ?775次閱讀

    按鈕控制LED程序(按亮再按一下滅)【匯編版】

    按鈕控制LED程序(按亮再按一下滅)【匯編版】按鈕控制LED程序(按亮再按一下滅)【匯編版】
    發(fā)表于 12-29 11:04 ?0次下載

    分析java接口和抽象類區(qū)別

    抽象類 二。接口 三。抽象類和接口的區(qū)別 。抽象類 在了解抽象類之前,先來了解
    發(fā)表于 09-27 16:40 ?0次下載

    通過抽象程序證明復(fù)雜具體程序

    描述了證明抽象程序和具體程序滿足致性關(guān)系的方法.抽象程序使用
    發(fā)表于 12-29 16:17 ?0次下載
    通過<b class='flag-5'>抽象</b><b class='flag-5'>程序</b>證明復(fù)雜具體<b class='flag-5'>程序</b>

    電動車的核心動力來源電池的成本大家起來探討一下

    這幾年在全球汽車圈電動車著實已經(jīng)火了很長時間。作為電動車的核心動力來源電池也是大家經(jīng)常討論的個話題,但這個核心部件的成本分析卻不多見,希望本文能夠拋磚引玉,吸引大家起來探討
    的頭像 發(fā)表于 07-08 16:23 ?5558次閱讀

    電磁爐加熱一下就停一下什么原因

    電磁爐加熱一下就停一下什么原因。
    的頭像 發(fā)表于 06-04 10:01 ?3.8w次閱讀

    詳細分析Verilog編寫程序測試無符號數(shù)和有符號數(shù)的乘法

    符號數(shù)的計算在 Verilog 中是個很重要的問題(也很容易會被忽視),在使用 Verilog 語言編寫 FIR 濾波器時,需要涉及到有符號數(shù)的加法和乘法,在之前的程序中我把所有的
    的頭像 發(fā)表于 05-02 10:48 ?7246次閱讀
    詳細<b class='flag-5'>分析</b>Verilog編寫<b class='flag-5'>程序</b>測試無<b class='flag-5'>符號</b>數(shù)和有<b class='flag-5'>符號</b>數(shù)的乘法

    芯片設(shè)計抽象層及其設(shè)計風(fēng)格

    在了解Verilog語言的更多細節(jié)之前,我們最好先了解一下芯片設(shè)計中的不同抽象層。
    發(fā)表于 11-05 15:51 ?12次下載
    芯片設(shè)計<b class='flag-5'>抽象</b>層及其設(shè)計風(fēng)格

    分析一下SR鎖存器的原理

    作為電路設(shè)計者,鎖存器很多場合都會用到,今天和大家分析一下SR鎖存器的原理。
    的頭像 發(fā)表于 08-20 17:30 ?6739次閱讀
    <b class='flag-5'>分析</b><b class='flag-5'>一下</b>SR鎖存器的原理