模型檢測是一種很重要的自動驗證技術,主要思想是先建立待測系統的有限狀態模型,然後用演算法窮盡檢測模型中的狀態,判斷其是否滿足待測屬性。若不滿足,則根據反饋資訊判斷具體系統中是否確實存在違反此屬性的執行路徑(即反例路徑)。
模型檢測依賴的是對程式行為空間的自動化遍歷。遍歷也就意味著窮盡搜尋,所以一開始模型檢測技術主要檢查的物件是用有窮狀態機(finite state machine)描述的系統模型。那麼檢測什麼呢?總得有個什麼叫對什麼叫不對的標準吧。在模型檢測領域,一般我們驗證的是某個模型是否滿足給定的形式化規約(formal specification)。有了系統的模型,有了檢測的規約,這兩者就構成了模型檢測技術的輸入。
模型檢測技術將自動化的去對系統模型的狀態空間進行顯式地遍歷或者符號化地不動點(fix point)計算來判斷該模型的行為是否滿足規約的要求,比如會不會出現溫度超過a,或者顏色跳錯了等。當檢查結束時,如果未出現反例,則這個模型對於此規約而言一定是正確的;而如果檢查**現反例,該技術會給出乙個具體的執行軌跡,告訴你模型是怎麼一步步執行並最終違反了你給出的規約。
由於模型檢測技術需要對狀態空間做乙個窮盡的搜尋,所以當系統狀態空間過大的時候,該技術的處理能力就會遇到一定問題。說直白一點,如果將這個系統背後可能的狀態乙個個列出來就能把你電腦記憶體吃乾淨甚至於都放不下的話,你還想在上面做搜尋,你的計算機一定要哭著臣妾做不到,分分鐘死給你看了。
所以,科學家們提出了各種各樣的包括符號模型檢測(symbolic model checking),偏序約減(partial oder reduction),狀態抽象(abstraction)等在內的一系列優化技術來壓縮狀態的表達,縮減要驗證的空間,提高遍歷的效率。隨著相關技術的逐步發展,模型檢測也終於從實驗室走向了應用,在電路設計,協議設計等領域發揮了巨大的作用。
符號執行 是一種程式分析技術,它可以通過分析程式來得到讓特定**區域執行的輸入。顧名思義,使用符號執行分析乙個程式時,該程式會使用符號值作為輸入,而非一般執行程式時使用的具體值。在達到目標**時,分析器可以得到相應的路徑約束,然後通過約束求解器來得到可以觸發目標**的具體值。
軟體測試中的符號執行主要目標是: 在給定的探索盡可能多的、不同的程式路徑(program path)。對於每一條程式路徑,(1) 生成乙個具體輸入的集合(主要能力);(2) 檢查是否存在各種錯誤,包括斷言違規、未捕獲異常、安全漏洞和記憶體損壞。
符號執行的主要思想就是將輸入(input)用符號來表徵而不是具體值,同時將程式變數表徵成符號表示式。因此,程式的輸出就會被表徵成乙個程式輸入的函式,即fun(input)。在軟體測試中,符號執行被用於生成執行路徑(execution path)的輸入。在具體的執行過程中,程式在特定的輸入上執行,並對單個控制流路徑進行了探索。因此,在大多數情況下,具體的執行只能在對相關財產進行近似分析的情況下進行。相反,符號執行可以同時探索程式在不同輸入下可能採用的多種路徑。這為可靠的分析鋪平了道路,可以對檢查的屬性產生強有力的保證。關鍵思想是允許程式採用符號而不是具體的輸入值。
執行路徑(execution path):乙個true和false的序列seq=。其中,如果是乙個條件語句,那麼pi=ture則表示這條條件語句取true,否則取false。
執行樹(execution tree):乙個程式的所有執行路徑則可表徵成一棵執行樹。
例如,圖1中的函式testme()有三個執行路徑,形成了圖2所示的執行樹。
3條不同的執行路徑構成了一棵執行樹。三組輸入,,覆蓋了所有的執行路徑。
符號狀態(symbolic state):符號執行維護乙個符號狀態e,它將變數對映到符號表示式。
符號路徑約束(symbolic path constraint):符號路徑約束pc,它是符號表示式上無量詞的一階公式。
符號執行後的結果如下圖所示:e和pc都在符號執行過程中更新。 在沿著程式的執行路徑的符號執行結束時,使用約束求解器來求解pc以生成具體的輸入值。如果程式在這些具體的輸入值上執行,它將採用與符號執行完全相同的路徑並以相同的方式終止。例如,圖1中**的符號執行以空符號狀態開始,符號路徑約束為true。執行過程中的狀態如圖中紅色部分所示。
最早將實際執行和符號執行結合起來的是2023年發表的dart[5],全稱為「directed automated random testing」,以及2023年發表的cute[6],即「a concolic unit testing enginefor c」。
concolic執行維護乙個實際狀態和乙個符號化狀態:實際狀態將所有變數對映到實際值,符號狀態只對映那些有非實際值的變數。concolic執行首先用一些給定的或者隨機的輸入來執行程式,收集執行過程中條件語句對輸入的符號化約束,然後使用約束求解器去推理輸入的變化,從而將下一次程式的執行導向另一條執行路徑。簡單地說來,就是在已有實際輸入得到的路徑上,對分支路徑條件進行取反,就可以讓執行走向另外一條路徑。這個過程會不斷地重複,加上系統化或啟發式的路徑選擇演算法,直到所有的路徑都被探索,或者使用者定義的覆蓋目標達到,或者時間開銷超過預計。
我們依舊以上面那個程式的例子來說明。concolic執行會先產生一些隨機輸入,例如,然後同時實際地和符號化地執行程式。這個實際執行會走到第7行的else分支,符號化執行會在實際執行路徑生成路徑約束
這個過程中,我們從乙個實際輸入出發,得到第乙個約束條件
注意在這個搜尋過程中,其實concolic執行使用了深度優先的搜尋策略。
參考:
技術執行與架構實踐
文章原文 本文討論如何構建技術執行能力.不論是企業招聘還是個人職業發展,都可以參照這個能力模型.先是回顧技術人員的3個能力象限.再從技術視角如何思考和判斷問題.到架構設計的原則.並通過交易和營銷的成功實踐分析,理解什麼是好的架構.前一篇提到的技術人的職責,可以總結為以下3點 技術視野和判斷力 tec...
感測器與檢測技術(二)
光電池主要有兩大型別的應用 將光電池作光伏器件使用 利用光伏作用直接將太陽能轉換成電能,即太陽能電池。太陽能電池已在宇宙開發 航空 通訊設施 太陽電池地面發電站 日常生活和交通事業中得到廣泛應用。隨著太陽電池技術不斷發展,成本會逐漸下降,太陽電池將獲得更廣泛的應用,如太陽電池電源 將光電池作光電轉換...
與活體檢測技術結合的人臉識別技術
隨著深度學 習方法的應用,人工智慧的發展,人臉識別技術 的識別率已經得到質的提公升,通過反覆開發試驗,目前我司的 人臉識別技術 率已經達到99 人臉識別技術 與其他生物特徵識別技術相吃比,在實際應用中具有天然獨到的優勢 通過攝像頭直接獲取,在非接觸的方式完成識別過程。通過人臉識別與證件識別的比對,目...