?

基于OpenMP的并行Fortran程序數據競爭靜態檢測方法

2023-11-10 15:11金大海宮云戰
小型微型計算機系統 2023年11期
關鍵詞:控制流線程語法

葛 優,金大海,宮云戰

(北京郵電大學 網絡與交換技術國家重點實驗室,北京 100876)

1 引 言

1.1 研究背景

隨著信息技術的跨越式發展,并行計算以及并行處理技術因為高性能、低成本的優點,在當今各行各業的軟件和系統中起到了舉足輕重的作用[1].在2021年的ISC21超算大會上,中國在TOP500的計算機數量位居首位,且系統峰值性能達到了125425.9TFlop/s.然而隨著并行計算機大規模的發展,故障和錯誤層出不窮,系統的可靠性問題亟待解決.

Fortran迄今為止仍是并行計算領域最流行的語言之一,但受限于其發明年代,最初的 Fortran 語言并不支持并行計算.而OpenMP作為可調用的并行庫和應用程序編程接口,將Fortran語言擴展為并行語言,它以其良好的靈活性和可移植性成為了共享存儲并行程序設計的工業標準.然而,由于編寫并行程序的復雜性以及運行結果存在著難以重現和隨機性[2],都會造成程序中的數據競爭故障,故障問題很難通過運行幾次程序發現并定位出來.因此,如何準確的檢測并行程序中數據競爭故障,提高程序的穩定性和可靠性,是本文研究的主要內容.

1.2 研究意義

1.2.1 國內外研究現狀

Atzeni等人提出的Archer[3]使用動靜結合的數據競爭檢測方法來進行OpenMP數據競爭檢測,它強制程序多次運行來查找其中的數據競爭問題.Archer通過僅檢測程序中的并行部分,減少了基于pthread的TSAN-LLVM工具[4]的分析空間.由于Archer使用影子內存來跟蹤每次內存訪問,存在檢測的內存需求和程序直接綁定的問題.此外由于Archer使用Polly獲取函數的依賴和加載,在沒有依賴的情況下將一段代碼列入黑名單.對于循環嵌套等問題,由于黑名單的存在,對缺陷檢測的準確度大大降低.

Gu等人提出的ROMP[5]維護每次內存訪問的訪問歷史,為隱式和顯式OpenMP任務構建任務圖并分析并發事件.ROMP具有較高的準確率和召回率,但它沒有對程序使用的所有動態加載的共享庫進行檢查.ThreadSanitizer[6]工具是基于Valgrid來檢測數據競爭問題,它采用的happens-before的混合方法,并為共享內存上的讀寫操作維護鎖集.由于它需要維護影子內存來存儲元數據,而每次訪問都需要影子內存,因此其內存需求會隨著線程之間的共享內存量線性增長,檢測的運行時間甚至會指數增長.

Basupalli 等人提出的OMPVerify[7]是一種基于多面體模型的靜態數據競爭檢測工具,其工作在抽象語法樹層面上.OMPVerify檢測的核心是通過計算多面體減少依賴關系圖(PRDG),來推斷OpenMP并行區域中可能存在的真實依賴關系、讀寫沖突以及過時的讀取問題.但OMPVerify只能處理OMP并行的結構,并且對存在的數據競爭問題沒有顯著的分類,因此檢測結果中存在的誤報問題明顯較多.

LLOV[8]作為一種基于LLVM獨立中間表示的靜態數據競爭檢測工具.它使用多面體框架Polly,基于其中間表示在LLVM框架中實現快速、靜態的數據競爭檢查.LLOV可以處理參數數組大小和循環邊界,并且其不依賴于運行時的線程數;但LLOV不支持OpenMP中用于同步和任務處理的制導指令,此外受多面體框架的影響,具有動態控制流和不規則訪問的程序不在LLOV分析范圍內.

現有的缺陷檢測工具對OpenMP并行程序的語言和語法特性進行分析的不多,一些研究人員是通過多面體模型來檢測指定的OMP并行構造進行靜態檢測分析,與他們工作不同的是,本文是針對OpenMP并行程序的指令特性來對數據競爭故障進行分析,從而建立數據競爭模型.因此本文方法對OpenMP制導指令的支持更健全和更準確.

1.2.2 本文工作

本文的工作應用數據流分析以及模型檢測理論,將數據競爭抽象為一種故障模型,并根據基于OpenMP的Fortran并行程序的語言特性,對控制流圖進行擴展引入并行控制流圖,以及對并行區域的數據域進行活躍變量及數據流計算,根據程序控制流節點上進行狀態轉化來實現數據競爭的檢測.此法不對源程序運行即可檢測出程序中的數據競爭故障,并且能夠全面、有效、準確的報告故障.

2 數據競爭故障分析

2.1 數據競爭故障

定義1.在程序內的某段代碼區域產生并行區域P,假定P中存在著n(n>=2)個線程,若多個線程對P中的同一變量x進行訪問,且有m(m>=1)個線程對x進行寫操作,則可能會發生數據競爭問題.數據競爭不會立即使程序崩潰,但這可能會導致程序在并行模式下產生不確定的結果.

在基于OpenMP的Fortran并行程序中,串行區域由主線程執行,并行區域則是由線程組執行[9].對于線程組中的線程來說執行的只是并行區域中的代碼部分,其操作的變量信息有一部分是與線程組中的其他線程共享的,另一部分則是其私有訪問的,并且在這兩部分中由于存在著變量的使用從而產生潛在的定值引用關系,從而產生其并行程序中的數據競爭問題.

2.2 數據競爭缺陷分類

2.2.1 循環攜帶數據依賴

循環攜帶數據依賴是指在并行區域P中,存在一個變量x,在線程t1的循環迭代中被讀取,在線程t2的循環迭代中被寫入,而t1!=t2.循環攜帶數據依賴故障主要是在指令需要稍后更新的值時會發生.結合圖1分析,在程序中,循環嵌套應該在第1行中是并行的,但標記為并行的是第3行的內部循環,此處產生循環攜帶依賴問題.因為在程序的第4行,a(i,j-1)的讀取取決于在前一次迭代中對a(i,j)的寫入.當在串行執行時毫無問題,但在并行計算時,不能獲取到a(i,j)處的未修改值,因此造成第4行產生一個數據競爭故障.

2.2.2 未指定行為

OpenMP是建立在共享存儲結構的計算機之上,線程間的全局變量和靜態變量是共享的,而局部變量是私有的[10].對于寫入并行區域中的共享變量,變量的最終值是取決于最后一次迭代的寫入,在串行情況下,這總是最后一次迭代,而在并行模式下,不能夠保證,因此會導致數據競爭產生不確定的結果.

1)臨時變量私有故障

臨時變量私有故障是指并行區域內的各個線程未對數據進行私有備份,導致在并行區域多個線程可同時訪問該數據,產生不確定的結果.如圖2,在程序的第5行各個線程對變量x的值進行更新,而循環的最后一次迭代沒能設置線程的私有備份x,導致最終的值不確定,在第5行產生一個數據競爭故障.

圖2 具有臨時變量私有故障的示例Fig.2 Example with temporary variable private

2)全局變量專有故障

全局變量專有故障是指并行區域內的線程未對全局數據進行專有拷貝,使其在多個并行區域之間保持連續性,導致多個線程同時訪問該數據,產生未知結果.如圖3,在程序的第2行和第3行聲明了全局變量counter、pcounter;在第5行只對變量pcounter進行線程專有設置;第9行在并行區域多個線程對counter值進行讀寫操作,導致counter值的不確定性,因此第9行產生一個數據競爭故障.

圖3 具有全局變量專有故障的示例Fig.3 Example with global variable exclusive

3)未定義的變量故障

未定義的變量故障是指該變量無有效的值,依賴于未定義變量值的使用導致未知結果產生.結合圖4分析,在程序的第1行變量b是private()指定的,此時變量未定義;在第5行時,變量b被并行區域內使用但b未被定義,導致變量i值的不確定,因此造成第5行產生一個數據競爭故障.

圖4 具有未定義故障的示例Fig.4 Example with undefined

3 數據競爭故障檢測框架

本文描述的是在課題組自主研發的缺陷檢測工具DTS[11]上的基于OpenMP的Fortran并行程序數據競爭的故障檢測,檢測框架如圖5所示.本文根據數據競爭故障的分類,將數據競爭問題抽象為一種故障模式狀態機,建立數據競爭故障模型;之后根據并行程序的語法和語義特性,進行并行程序建模; 最后將故障檢測問題轉化為一個計算故障模式狀態機實例可能狀態集合的正向數據流問題,沿著控制流節點通過判斷變量的讀寫定值關系,迭代狀態機實例的狀態集合進行數據競爭故障的檢測.故障檢測流程的關鍵技術如下所示:

圖5 數據競爭故障檢測框架Fig.5 Data race detection framework

1)對源代碼進行掃描,根據Fortran并行程序的語法和語義特性,構建對應的抽象語法樹和并行控制流圖,進行并行程序建模;

2)通過多次遍歷抽象語法樹,建立待分析程序的符號表.在符號表中存儲著標記符的作用域信息、聲明使用信息等;

3)進行并行數據流分析,計算并行區域內特殊數據作用域涉及到的變量隱式引用和隱式定值關系,來確定并行區域中變量的讀寫關系;

4)將數據競爭故障抽象為一種模型,并建立這種模型的缺陷模式狀態機,將模型描述文件載入到檢測引擎中;

5)在程序函數內部為每個相關的句柄建立一個狀態機實例,通過在控制流圖上迭代狀態機,利用相關算法計算狀態的轉變,完成對數據競爭故障的檢測.

4 Fortran并行程序建模

4.1 并行程序抽象語法樹構建

由于Fortran程序實現并行是在串行程序中添加OpenMP API來構建的,而OpenMP作為并行語言,在語法上與Fortran是獨立的.并行程序中的編譯指導指令如OMP PARALLEL在構建Fortran抽象語法樹時不會被解析生成抽象語法樹節點[12],僅僅對Fortran源程序構建語法樹的方法是不能識別出并行區域的.因此,本小節提出了一種Fortran并行程序抽象語法樹的構建方法.

4.1.1 抽象語法樹節點處理

對于Fortran程序的并行區域是根據OMP DO等編譯制導指令將指令包圍起來的串行區域并行化,制導指令只會將計算分散到不同線程中來加快執行速度,不會影響Fortran程序的計算結果.因此對于Fortran代碼塊來說,若代碼塊的外側存在著一對制導指令,就可以確定這段代碼需要并行執行.因此在抽象語法樹生成的節點中,確定Fortran代碼段與OMP制導指令的綁定關系,即可對并行程序的抽象語法樹進行構建和訪問.

1)基于ANTLR詞法語法解析器[13],對Fortran和OpenMP生成對應的抽象語法樹節點信息,在當前節點中存儲其父結點及孩子節點信息.

2)對節點信息進行拆分和讀取;根據節點關系特征,按照樹高從上到下逐層讀取語法樹節點,每次都開辟一個新的空間來存儲下一層節點的信息.

3)對節點信息進行標記;首先在抽象語法樹節點存儲對應行號信息,然后按照行號確定Fortran與OpenMP節點間的關系,確定并行入口節點、并行出口節點以及并行區域Fortran起始和結束節點.

4.1.2 基于鄰接表的節點訪問算法構建

根據上文的節點生成、節點存儲以及節點標記,本文使用鄰接表作為重建抽象語法樹的存儲結構,通過鄰接表存儲串行和并行出入口節點來實現對Fortran并行程序的節點訪問算法.

此算法基本思想為:首先利用鄰接表存儲并行抽象語法樹節點關聯信息,將并行區域起始節點的父節點作為鄰接表的鄰接數組,將對應的OpenMP并行入口節點作為其鄰接表內的鄰接關系.之后對語法樹節點訪問時,先遍歷鄰接數組,判斷訪問的該節點是否在鄰接表中存在,如果存在即當前節點為并行入口節點,則訪問其鄰接表內對應鄰接關系節點為其并行抽象語法樹的孩子節點;否則根據深度優先搜索直接訪問其孩子節點信息.

4.2 并行控制流圖構建

Fortran并行程序是由串行代碼塊和并行代碼塊交替組成的代碼區域,對于串行控制流圖來說,并不能表示因為OpenMP指導指令產生的并行區域,因此本小節提出了Fortran并行控制流圖來解決這一問題.

算法.基于鄰接表的節點訪問算法

輸入:鄰接表、抽象語法樹節點

輸出:抽象語法樹節點訪問信息

1. begin:

2. createAdjacencyList(root);//鄰接表存儲節點關聯信息

3. ASTprogram_unit ast !=null

4. for all num in nunMap do //遍歷鄰接數組

5. if node==num.key then

6. root.astNodeAddChild(createTree(root,node),root.child);//節點信息添加到語法樹中

7. for all n in num.nodeList do //遍歷訪問鄰接節點的鄰接鏈表

8. visitNodeInfo(n);

9. else if node is not in numMap.key then //鄰接數組中不存在當前節點

10. root.astNodeAddChild(createTree(root,node),root.child);

11. for all i in node.getChildNum()do //遍歷訪問該節點的孩子節點

12. visitNodeInfo(node.getChild(i))

13. end for

14. return ast //返回語法樹節點訪問信息

15. end

4.2.1 Fortran并行控制流圖定義

定義2.設一個Fortran并行程序中存在N個并行代碼塊,那么該程序的并行控制流圖(PCFG),可表示為三元組{Gs,Gp,Ep}:

Ep定義為串行區域與并行區域控制流的邊集,是從串行區域進入并行區域以及從并行區域離開串行區域的特殊控制流.

4.2.2 Fortran并行控制流圖生成算法

在Fortran并行區中,一般包含任務共享結構,根據Fortran并行語法特征,主要將其分為兩類:一類是如OMP DO結構,每個線程對應的串行控制流子圖相同,只是遍歷的循環的迭代空間不同;另一類則如OMP SECTIONS結構,對于任意兩個線程所對應的串行控制流子圖不相同[14].

針對這兩種不同的任務共享結構,本文的并行控制流圖(PCFG)的生成算法基本思想為:首先根據語法樹節點確定并行標志位和串行標志位,通過訪問標志位來判斷當前語句節點為串行或者并行控制流,之后根據語句結構設計相應的控制流子圖,最后將生成的控制流子圖寫入并行控制流圖數據結構中.對于并行區域,則需要根據任務共享結構確定其相應類型,來生成控制流子圖.

算法:并行控制流圖生成算法

輸入:控制流輔助結構、抽象語法樹節點

輸出:并行控制流圖信息

1. begin:

2. gsFlag <-getFlagByParseTree(ast)//通過當前語法樹節點確定是否訪問串行標志位

3. gpFlag <-getFlagByParseTree(ast)

4. if gsFlag==true then //語句節點為串行控制流

5. node <-createPcfgNode(ast)//創建控制流節點

6. gsi <-new CFG(ast,node.addEdge())//根據語句結

構生成控制流子圖

7. gs.add(gsi);

8. visitNextStatement(ast)//訪問下一條語句

9. else if gpFlag==true then //語句節點為并行控制流

10. shareFlag<-getShareStructFlag(ast)//確定節點的任務

共享結構

11. if shareFlag==true then//并行區任務共享結構相

同時

12. node <-createPcfgNode(ast)

13. gp.add(new CFG(ast,node.addEdge()));

14. else if shareFlag==false then

15. for all i in node.getThreadNum()do//遍歷并行區

域內的線程數

16. ni <-createPcfgNode(ast)

17. gp[i] <-new CFG(ast,ni.addEdge())//為不

同線程創建串行控制流子圖

18. gp.add(gp[i]);

19. end for

20. visitNextStatement(ast)//訪問下一條語句

21. end if

22. end

5 數據競爭故障模式狀態機的設計

定義3.缺陷模式狀態機是描述存在有限個缺陷模式狀態以及在這些狀態之間的轉移和動作等行為的數學計算模型,包括非空有限狀態集合S、輸入字母表Σ及轉移函數集合δ,S0是初始狀態,為S的子集,其中δ:S×Σ→S.

在2.2節中討論的兩類數據競爭缺陷,可以用圖6所示的缺陷模式狀態機來描述.它以被分析的函數為單元,針對并行區域內調用的全局/局部變量創建狀態機實例,并通過對變量的讀寫操作進行跟蹤進行缺陷報告.

圖6 數據競爭缺陷模式狀態機Fig.6 Data race defect mode state machine

數據競爭狀態機的狀態集合S設計為:{START,LOOP_DEPENDENCY,UNDEFINE,ERROR,END}.其中START狀態代表狀態機的唯一入口;END狀態代表結束狀態;LOOP_DEPENDENCY狀態代表著當前節點進入到循環執行的任務分擔域,其中的各個線程各自分擔其中一部分工作;UNDEFINE狀態代表著當前節點內的數據變量被設置為對并行部分的線程可見/私有;ERROR狀態代表當前分析的節點產生數據競爭缺陷.

表1標識了數據競爭狀態轉換過程.

表1 數據競爭的狀態轉換Table 1 State transition of data race

6 數據競爭故障檢測算法

根據2.1節談到的兩種情況,可以看到這兩種情況主要是分為循環攜帶依賴和未指定行為.因此,下面將對數據競爭檢測算法分為循環攜帶依賴故障的檢測算法和未指定行為的檢測算法兩個部分來描述:

數據競爭檢測算法所用到的定義如下:

N:控制流圖中所有節點的集合;

getEvaluationResults(node,xpath):通過Xpath檢索當前程序中是否存在并行區域;

createSMInstance(var):變量var創建狀態機實例;

getState(var,n):獲得var在節點n上的狀態,有START、LOOP_DEPENDENCY、UNDEFINE、ERROR、END;

addGen(state):添加新的狀態至gen[n];

in[n]:到達節點n之前的所有狀態;

out[n]:到達節點n之后的所有狀態;

gen[n]:到達節點n之后創建或迭代的所有狀態.

6.1 循環攜帶依賴故障的檢測算法

以下是循環攜帶依賴故障檢測算法涉及到的幾個定義:

checkDependency(n):判斷當前節點是否依靠并行區域的循環迭代次序,若為true,則說明依靠,反之不依靠.

compareDependency(leftVar,rightVar):比較賦值操作的左右兩邊的變量操作是否存在著讀后寫或者寫后讀問題.

此算法思想為:為程序中每個并行循環迭代變量創建故障狀態機實例,在并行控制流圖上根據狀態轉換條件進行狀態的迭代,當節點中的狀態為ERROR或END時,則整個算法結束.

算法.循環攜帶依賴故障檢測算法

輸入:并行控制流圖、故障模式狀態機

輸出:報告數據競爭

1. begin:

2. for node in getEvaluationResults(node,xpath)

3. do createDBStateInstance(n)

4. for each n in N do

5. do in[n]=out[n] !=null

6. visited=true

7. if visited then

8. for each n in N do

9. if n==entry then //當前節點為控制流圖的入口節點

10. in[n]=state.getValue(START)

11. elseif checkLoop(n)

12. n.addGen(LOOP_DEPENDENCY);

13. detectLoopRace(n)//判斷節點是否存在數據依賴問題

14. elseif checkUnDefined(n)&& IsAssignmentStmt(node)then

15. n.addGen(UNDEFINE);

16. end for

17. end

18. detectLoopRace:

19. begin:

20. if getState(node,n)=LOOP_DEPENDENCY &&checkDependency(n)then

21. if compareDependency(leftVar,rightVar)//判斷并行循環區域變量迭代的讀寫依賴情況

22. n.addGen(ERROR);

23. report find Data Race //報告數據競爭問題

24. elseif !checkDependency(n)then

25. n.addGen(END);

26. end

27. end

6.2 未指定行為的檢測算法

對于Fortran并行程序來說,由于某些變量在進入并行區后具有特殊的數據作用域屬性[15],如OMP PARALLEL PRIVATE(a),變量a被指定為并行區域中的私有屬性,即會在每個線程里定義新的同類型對象,取代原始變量.則對于a來說,在并行區域中產生的每個線程,都將擁有其值未定義的私有副本.因此本文使用基本數據流分析方式,求解并行程序的結果可能不正確.

6.2.1 并行數據流分析

定義4.隱式引用和隱式定值定義為并行區域中由OpenMP指令導致的潛在賦值操作引發的定值和引用關系.即對于一個共享變量,如果在并行區域中被聲明作為線程某種類型的私有變量,那么變量的共享版本值有可能會傳遞給線程中某一個私有副本,某一個私有副本的值也可能會傳遞給變量的共享版本.

并行數據流分析就是要在基本數據流分析的基礎上對隱式引用和隱式定值進行分析和處理,使并行區域中存在隱式引用和隱式定值的代碼塊顯示地存儲在對應變量的定義出現(DEF)集合和使用出現(USE)集合中[16],來確定并行區域中變量的讀寫關系.

6.2.2 未指定行為的檢測算法

getSameParallel(node,samePath):判斷當前控制流節點對應的抽象語法樹中并行區域是否為相同任務共享結構;

isLocalScope(n):判斷當前節點的符號表作用域;

此算法思想為:與循環攜帶依賴故障檢測算法一致,也是控制流圖迭代狀態,但未指定行為中任務共享結構分為兩種,要對串行控制流子圖相同與否進行分類分析,此外在迭代過程中對于各個線程的變量進行并行數據流分析,最終當前控制流節點的讀寫情況來確定是否含有數據競爭問題.

算法.未指定行為檢測算法

輸入:并行控制流圖、故障模式狀態機

輸出:報告數據競爭

1. begin:

2. for node in getEvaluationResults(node,xpath)

3. do createDBStateInstance(n)

4. for each n in N do

5. do in[n]=out[n] !=null

6. visited=true

7. if visited then //當前節點位于控制流圖

8. isSame=getSameParallel(node,samePath)

9. if isSame←true &&isLocalScope(n)then

10. if checkUnDefined(n)then //并行區域串行控制流子圖相同時的情況

11. n.addGen(UNDEFINED)

12. goto detectUndefine

13. elseif checkSectionUndefined(n)then //并行區域串行控制流子圖不相同時的情況

14. n.addGen(UNDEFINED)

15. goto detectUndefine

16. end for

17. detectUndefine:

18. begin:

19. in[n]=∪p∈pred[n]out[p]//進行數據流分析

20. old[n]=out[n]

21. out[n]=gen[n]∪(in[n]-kil([n]))

22. liveIn[n]=getParallelUseDef(out[n])//對并行線程副本的定義-使用關系進行分析

23. if liveIn[n]={var:ERROR} then

24. report find Data Race

25. end

26. end

7 實驗結果與分析

為了進行實驗評估,本文選擇了DataRaceBench Fortran 1.3.2 基準測試集[17],可以系統和定量評估數據競爭檢測工具的有效性.DataRaceBench Fortran是由166個微基準內核組成的,其中83個具有已知的數據競爭問題,剩余83個不存在任何數據競爭問題.

以運用本文所提出的方法參與開發的缺陷檢測系統(DTS)為工具進行實驗,對DataRaceBench Fortran進行檢測,并與其他檢測工具進行比較,表2為測試結果.

表2 不同工具檢測的最大競爭數Table 2 Maximum number of races reported by different tools

表2中的TP表示能檢測到已存在的缺陷,FN表示未能檢測到已存在的缺陷,TN表示能檢測到不存在缺陷問題,FP表示誤報,不存在缺陷卻檢測到;誤報率表示本工具中檢測到的誤報缺陷數占所有不存在缺陷問題總數的百分比.

根據表2中的實驗對比數據,可以看出運用本方法的DTS與國際一流工具相比在數據競爭檢測的準確性上基本持平,尤其是DTS的平均誤報率僅為18.07%,比效果最好的ROMP 21.69%的誤報率低了3.62%,這說明DTS能正確報出故障的效果是最好的,具有更好的檢測性能.

為了驗證DTS檢測的穩定性和精確性,對UP2D、NDYN、ParallelForest[18]等3個大型開源項目進行檢測,表3為測試的結果.

表3 開源項目測試結果Table 3 Open source project test results

IP表示檢測工具檢測到的數據競爭故障,Defect表示IP中經人工確認后真實存在的數據競爭故障,精確率是對預測結果的接近程度進行度量,其表示為Defect個數占IP個數的百分比,較高的精確率表示該檢測工具通常會在存在數據競爭時識別出數據競爭問題.運用本方法的DTS檢測工具與ROMP檢測工具的測試結果進行對比,圖3為對應的結果.在所測的3個項目中,DTS經人工確認后的真實故障數為31個,平均精確率為72.09%,而ROMP檢測出來的真實故障數為18個,平均精確率為64.29%.從表3可以看出運用本方法的DTS能夠檢測出更多的故障并且精確率更高,說明本文提出的檢測方法是有效的,具有更好的精確性.

8 結 論

本文采用靜態分析方法檢測 OpenMP并行Fortran程序中的數據競爭問題,并通過所研發的測試工具來證明了本方法的可行性,同時實驗數據也證明了本方法在數據競爭檢測上的有效性.但通過實驗數據也顯示了本方法并不能完全排除漏報和誤報問題.通過分析,本文發現漏報問題主要是由于有些數據競爭故障沒有被歸類以及函數調用關系劃分不準確造成的,而誤報問題是由于并行數據流的分析不準確造成的.今后的研究方向將在以下3個方面改進:首先是進一步總結數據競爭問題出現的情況,將其進行更細致全面的抽象歸類;其次是對并行數據流進行優化以及變量進行區間計算,盡量減少誤報和漏報;最后是將此方法應用于更多的故障檢測中去.

猜你喜歡
控制流線程語法
抵御控制流分析的Python 程序混淆算法
工控系統中PLC安全漏洞及控制流完整性研究
抵御控制流分析的程序混淆算法
跟蹤導練(二)4
Book 5 Unit 1~Unit 3語法鞏固練習
淺談linux多線程協作
基于控制流隱藏的代碼迷惑
基于上下文定界的Fork/Join并行性的并發程序可達性分析*
Linux線程實現技術研究
么移動中間件線程池并發機制優化改進
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合