在計算機編程,程序切片是一組程序語句的計算,切片可用於調試以更容易地定位錯誤源。切片的其他應用包括軟件維護,優化,程序分析和信息流控制。
自Mark Weiser最初的定義以來,切片技術一直在迅速發展。最初,切片只是靜態的,即應用於源代碼而沒有除源代碼之外的其他信息。Bogdan Korel和Janusz Laski介紹了動態切片,它適用於程序的特定執行(對於給定的執行跟蹤)
靜態切片 VS 動態切片
(1)靜態切片
僅僅是靜態可用的信息
沒有對輸入做任何假設
計算切片通常是不準確的
識別最小切片是一個不可確定的問題
結果可能並不有用
(2)動態切片
對給定的輸入進行計算
實際而不是
適用於調試和測試等應用程序
Examples1:(static backward slice)
使用後向靜態切片,關於程序點p和程序變量組V的程序的後向切片;關於程序點p和程序變量集V的程序的後向切片由程序中的所有語句和謂詞組成,這些語句和謂詞可能影響V中的變量值;程序點p和變量集V一起形成切片標準,通常寫爲<p,V>。
一般方法:向後遍歷程序流程
切片從點p開始(C =(p,V))
檢查可以執行的語句
在p之前(不只是在p之前出現的語句)
添加影響p的值或執行的語句以獲得p
考慮傳遞依賴
程序執行方式:
如果切片中的語句形成可以執行的語法正確的程序,則切片是可執行的。
如果正確(安全地)計算切片,則運行作爲可執行切片的程序的結果對於所有輸入的V中的變量產生相同的結果。
執行結果:
Examples2:(Dynamic slice)
對於程序的特定執行e,關於程序點p處的變量v的輸入值的程序的動態切片是程序中影響v的值的所有語句的集合。
程序點p,變量V和e的輸入i形成切片標準,通常寫爲<i,v,p>。 切片使用輸入i的程序的執行歷史或軌跡。
Compare the static slice with dynamic slice
Method for computing slices
流程圖上的數據流
過程內:控制流圖(CFG)
過程間:過程間控制 - 流程圖
依賴圖中的可達性
過程內:程序依賴圖(PDG)
過程間:系統依賴圖(SDG)
數據流方程(CFG上的數據流)
迭代過程(通過CFG)
使用數據依賴性爲CFG中的每個節點計算連續的“相關”變量集
不明確計算控制依賴性
控制謂詞的變量(if,while)如果其身體中的任何一個陳述相關,則“間接相關”
從切片準則開始:C =(p,V)
繼續,直到達到一個固定點(即,最後一次迭代沒有找到新的相關語句)
關於一些程序分片的源碼,可在github上參考:https://github.com/search?q=programming+slice