循环结构的数据流分析方法
一 引言
??????? 在測試人員對代碼文件進行靜態分析過程中,數據流分析占有舉足輕重的作用,很多重要的信息,比如不可達語句、DU、DD、UR…等都是基于數據流分析的結果而得出的。以往,數據流分析通常是由測試人員人工完成。測試者在理解代碼邏輯的基礎上,從被分析代碼的起點跟蹤數據的流向,直到到達被分析代碼的終點。這項工作看起來簡單,但是實際做起來卻往往令測試人員感到非常頭疼。主要原因有三點:1.數據的變化要隨著路徑長度的增加不斷累積;2.分支條件要隨著路徑的增長不斷累積,并且路徑上每增加一個分支節點,都要在路徑中最新的數據分析結果的基礎上計算分支條件的值; 3.路徑數通常隨著代碼規模的增長以幾何級數的速度增長。無論是數據變化結果的累積還是分支條件的累積或者路徑數的增長,當任何一個累計到一定數量的時候,對于人腦來說,在進行跟蹤與分析就成為一件不可能完成的任務了。所以在實際的工作中,測試人員的通常做法就是盡力而為,能分析多少就分析多少。這就使很多隱藏在代碼中的很多問題在測試人員面前逃之夭夭。
?????? 隨著計算機技術的不斷發展,各行各業的信息化工作也進行得如火如荼。“讓電腦代替測試人員進行數據流分析”也不斷的被提到測試行業的信息化工作當中。然而卻一直進展緩慢,始終達不到工程應用的水平。最主要的攔路石有兩塊:1 代碼中的循環結構的數據流分析;2代碼中的函數調用語句的數據流分析。本文闡述的分析方法能夠準確高效的完成循環結構的數據流分析。關于函數調用語句的數據流分析方法在另外一篇文章中闡述。
?
二 基本概念
??????? 在介紹具體方法之前,先交代涉及的主要的概念。代碼的數據流分析,顧名思義就是對一段代碼中從起點到終點數據流動的全過程進行分析。在數據流動的過程中,可能會出現數據定值,也可能會出現數據引用。同時,由于代碼中有可能會存在多種分支語句,因此,從起點出發,會產生一條或者多條路徑,每條路徑中由多個節點組成,每個節點對應相應的約束條件,除此之外,每個節點還對應著到達該節點之前所有的變量應用的最終結果,我們將其稱之為數據切片。隨著路徑長度的增長,約束條件不斷累積,在到達終點之前,如果約束條件的取值為永假,則路徑終止,此路徑為不完整路徑,如果順利到達終點,則此路徑為完整路徑。由于本文闡述的是循環結構的數據流分析方法,所以有必要介紹循環相關的概念。循環的入口條件表達式如果是可計算的,或者循環中的跳出語句的約束條件集合是可求值的話,則循環為正常結束循環;否則的話,在數據流分析過程中,為了避免無意義的循環導致路徑的無限延長,本文闡述的方法會設定一個閾值,如果不是正常結束循環,當循環次數超過閾值后,強制令循環終止,這樣的循環稱之為強制結束循環。循環中的語句和循環后的語句由于可能受到循環所造成的數據變化的影響,稱之為循環相關語句。
?
三 循環結構的數據流分析
?????? 對于沒有循環結構和函數調用語句的代碼段,目前已經形成了比較成熟的數據流分析方法,循環結構的數據流分析是對普通數據流分析方法的改進。
1 普通的數據流分析方法
??????? 對于沒有循環和函數調用的代碼段,一般的數據流分析方法包括變量應用分析、構建塊樹、建立控制流圖、遍歷路徑等幾個步驟。
- 變量應用分析
??????? 在語法分析的基礎上,對在代碼中發生定值及引用的語句進行分析,并將定值及引用的變量及其具體值按照發生的順序進行記錄。注意,一定要按照順序記錄,因為不同的順序會產生不同的數據結果。
- 構建塊圖
??????? 在詞法分析、語法分析的基礎上,以代碼段起始點為根節點,分析代碼段中各分支語句如if、else if、for、 while、case…等分支語句以及break 、exit、 return…等強制轉向語句的層次關系及先后關系,從而構建成一顆樹,通常會將帶有函數調用的語句處理為普通語句,不做為單獨的一個塊來處理。
- 建立控制流圖
??????? 在塊樹構建完成后,從根節點開始,以根節點作為源點,按照子塊的先后順序及層次關
系對子塊進行分析,根據每個子塊的具體類型建立其所有目標節點,所有塊分析完畢后,將會構建成特定代碼段的控制流圖。
- 遍歷路徑
??????? 從控制流圖的源點開始,使用深度優先搜索遍歷圖中所有路徑,路徑邊上面的變量應用都要記錄到數據切片上。以最新的數據切片為基礎,在遍歷的過程中不斷計算各節點累積約束條件的邏輯值,計算并記錄下每個節點對應的最新的數據切片,獲取所關注的數據流分析結果。
?
2 循環結構數據流分析
?????? 要對循環結構進行正確的數據流分析,前提是正確的繪制for,while, do,break, continue等循環相關塊的控制流圖。在此基礎上,本文分別介紹正常結束循環和強制結束循環兩種情況下的數據流分析方法。
- 正常結束循環
?????? 如果循環是正常結束循環,那么就按照正常的數據流分析即可。相較于普通的數據流分析方法,所不同就是路徑隨著循環次數的增加不斷延長,直至循環結束。
- ?強制結束循環
?????? 由于循環被強制結束,所以每條路徑的最新的數據切片、約束條件集合都是不準確的。理論上說,循環相關的語句都是不能夠進行正確的數據流分析了,包括循環中的語句和循環后的語句。可循環相關語句的數據流分析往往非常重要,所以只能盡力而為了。通過對循環結構內部的數據分析,我們能夠獲取循環內部數值可能會發生變化的變量集合,這個集合可以看成是當前強制結束循環所造成的數據結果。在路徑遍歷過程中,如果到達了循環相關語句中的分支語句,暫時可將循環視而不見,認為其不存在,對分支語句的分支條件進行變量分析,如果該條件中使用了循環內部的定值集合中的變量,則認為其可取任意值,不進行分支條件的數值檢測,所有分支路徑都遍歷。如果該條件中沒有使用循環內部的定值集合中的變量,則進行正常的數據流分析。如此,能夠對強制結束循環的循環相關語句中的相當一部分進行必要的數據流分析。
?
四 具體應用
?????? 在測試之家開發的ufinder(不可達語句檢測工具)V0.97中應用了上文闡述的對循環結構的數據流分析分析方法,相對于一般的數據流分析,在ufinder中對數據流分析進行了一定程度的簡化,主要有兩點:1.數據切片中僅僅存儲變量的定值,而沒有存儲變量的引用;2.遍歷過程中如果找到一條完整路徑,說明存在一條可達路徑,遍歷過程立刻停止;通過實際工程應用的檢驗,本文闡述的方法確實能夠準確高效且全面地對包含有函數調用語句的代碼段進行數據流分析。
?
?
?
總結
以上是生活随笔為你收集整理的循环结构的数据流分析方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简易计时器的设计与实现-DE2|VHDL
- 下一篇: 计算机的flash player在哪里,