指針分析方法及裝置的制造方法
【技術領域】
[0001] 本發明實施例涉及計算機技術,尤其涉及一種指針分析方法及裝置。
【背景技術】
[0002] 隨著計算機的普及,計算機軟件越來越復雜,其中使用的程序語句類型也更加靈 活和豐富,以通常使用的C和C++程序語句為例進行說明,程序語句中指針的使用愈加廣 泛。指針語句的使用是決定程序被編譯優化后運行性能優良的重要因素,因此,對于程序的 編譯優化基于對程序語句中指針的分析。
[0003] 對指針的分析一般指對該指針變量性質和指向集的分析。目前,在進行指針分析 時,通常使用精度較高的流敏感上下文敏感(Flow-Sensitive and Context-Sensitive,簡 稱為:FSCS)的分析方法,但直接使用該類方法不適用于多線程程序。一種直觀的針對多線 程程序的指針分析,可以通過對全局變量進行指針分析獲取全局共享量對程序的并行區域 內不同線程間的交互影響;具體地,分析全局共享量在各程序點的指針指向集、線程間交互 指向集和當前程序語句執行結束后在指向圖中新增的指向邊。
[0004] 現有技術中對多線程程序的語句進行的指針分析方法,只考慮到全局共享量對程 序的并行區域內線程間的交互影響,因此,進行指針分析的共享量僅局限于程序中的全局 共享量,使得指針分析的對象,即程序中的共享量范圍縮小,降低了指針分析的精度。
【發明內容】
[0005] 本發明實施例提供一種指針分析方法及裝置,以解決現有技術中對多線程程序的 指針分析僅局限于程序中的全局共享量,分析結果不全面的問題。
[0006] 第一方面,本發明實施例提供一種指針分析方法,包括:
[0007] 讀取待分析的多線程程序中的語句信息;
[0008] 根據所述程序的語句信息對所述程序進行指針分析,獲得所述程序的共享信息, 所述共享信息包括共享量、指針指向集和訪存行為,其中,共享量包括全局共享量和局部共 享量;
[0009] 根據所述程序的共享信息對所述共享量進行補償分析。
[0010] 在第一方面的第一種可能實現方式中,所述根據所述程序的語句信息對所述程序 進行指針分析,獲得所述程序的共享信息,包括:
[0011] 根據全局共享判斷規則對所述程序進行分析,獲得所述程序中的全局共享量;
[0012] 對所述程序中每個線程進行指針分析,獲得每個線程中的指針指向集、局部共享 量和與所述共享量對應的訪存行為。
[0013] 根據第一方面的第一種可能的實現方式,在第二種可能的實現方式中,所述全局 共享判斷規則包括:
[0014] 若變量可以被程序中至少兩個線程同時訪問,則所述變量為全局共享量。
[0015] 根據第一方面的第一種或第二種可能的實現方式,在第三種可能的實現方式中, 所述對所述程序中每個線程進行指針分析,獲得每個線程中的指針指向集、局部共享量和 與所述共享量對應的訪存行為,包括:
[0016] 對所述程序中每個線程進行指針分析,獲得每個線程中的指針指向集;
[0017] 根據所述全局共享量、所述指針指向集和局部共享判斷規則對每個線程進行分 析,獲得每個線程中的局部共享量;
[0018] 根據所述全局共享量、所述局部共享量和所述指針指向集對每個線程進行分析, 獲得與所述共享量對應的訪存行為。
[0019] 根據第一方面的第三種可能的實現方式,在第四種可能的實現方式中,所述局部 共享判斷規則包括:
[0020] 若給定線程中變量可以作為所述程序中某個線程的入口參數而被其他線程訪問, 則所述變量為局部共享量;或者,
[0021] 若給定線程中變量可以通過被全局共享量間接引用的方式而被其他線程訪問,則 所述變量為局部共享量;或者,
[0022] 若給定線程中變量可以通過全局共享量的賦值,使得所述變量的指向集包含所述 全局共享量,則所述變量為局部共享量。
[0023] 根據第一方面的第三種或第四種可能的實現方式,在第五種可能的實現方式中, 所述根據所述全局共享量、所述指針指向集和局部共享判斷規則對每個線程進行分析,獲 得每個線程中的局部共享量,包括:
[0024] 根據所述全局共享量、所述指針指向集和局部共享識別規則,獲取每個線程中可 能逃逸的局部變量;
[0025] 根據所述可能逃逸的局部變量和共享傳播規則,確定從所述可能逃逸的局部變量 中獲取的可能被其他線程使用的局部變量為局部共享量。
[0026] 根據第一方面、第一方面的第一種到第五種可能的實現方式中任一種,在第六種 可能的實現方式中,所述根據所述程序的共享信息對每個共享量分別進行補償分析之前, 還包括:
[0027] 根據所述程序的語句信息生成并行控制流圖;
[0028] 根據所述并行控制流圖和所述共享信息生成針對所述程序的共享量訪存圖SAG ;
[0029] 所述根據所述程序的共享信息對所述共享量進行補償分析,包括:
[0030] 根據所述SAG對所述共享量進行補償分析。
[0031] 根據第一方面、第一方面的第一種到第六種可能的實現方式中任一種,在第七種 可能的實現方式中,所述共享量具有相應的定值點和引用點對;所述根據所述程序的共享 信息對所述共享量進行補償分析,包括:
[0032] 根據傳播判斷規則獲得所述定值點和引用點對之間可以相互影響的共享量;
[0033] 將所述定值點和引用點對之間可以相互影響的共享量的所述定值點的指針指向 集傳播到對應的引用點。
[0034] 根據第一方面、第一方面的第一種到第七種可能的實現方式中任一種,在第八種 可能的實現方式中,所述讀取待分析的多線程程序中的語句信息之前,還包括:
[0035] 接收用戶發送的指針分析指令;
[0036] 所述讀取待分析的多線程程序中的語句信息,包括:
[0037] 根據所述指針分析指令讀取所述待分析的多線程程序中的語句信息。
[0038] 根據第一方面、第一方面的第一種到第八種可能的實現方式中任一種,在第九種 可能的實現方式中,所述根據所述程序的共享信息對所述共享量進行補償分析之后,還包 括:
[0039] 采用所述補償分析的結果,對所述程序進行優化處理。
[0040] 第二方面,本發明實施例提供一種指針分析裝置,包括:
[0041] 讀取模塊,用于讀取待分析的多線程程序中的語句信息;
[0042] 指針分析模塊,用于根據所述讀取模塊讀取的所述程序的語句信息對所述程序進 行指針分析,獲得所述程序的共享信息,所述共享信息包括共享量、指針指向集和訪存行 為,其中,共享量包括全局共享量和局部共享量;
[0043] 補償分析模塊,用于根據所述指針分析模塊獲得的所述程序的共享信息對所述共 享量進行補償分析。
[0044] 在第二方面的第一種可能實現方式中,所述指針分析模塊,包括:
[0045] 程序分析單元,用于根據全局共享判斷規則對所述程序進行分析,獲得所述程序 中的全局共享量;
[0046] 線程分析單元,用于對所述程序中每個線程進行指針分析,獲得每個線程中的指 針指向集、局部共享量和與所述共享量對應的訪存行為。
[0047] 根據第二方面的第一種可能的實現方式,在第二種可能的實現方式中,所述全局 共享判斷規則包括:
[0048] 若變量可以被程序中至少兩個線程同時訪