基于靜態分析和動態運行的Web應用JavaScript代碼原子性違反檢測的制作方法
【技術領域】
[0001] 本發明屬于計算機技術領域,尤其是軟件工程技術領域。本發明提供了一種基于 靜態分析和動態運行的、用于檢測Web應用中JavaScript代碼原子性違反的方法,能夠保 證Web應用的質量并提升性能。
【背景技術】
[0002] Web應用的飛速發展得益于服務器端語言(如PHP)和客戶端語言(如 JavaScript)的強大支撐。相比于傳統笨重的Java Web開發,如今的Web開發更多使用輕 量級Web框架,對于前端腳本語言JavaScript而言,既是機遇,也是挑戰。
[0003] JavaScript (以下簡稱JS)是一個基于事件的腳本語言,其閉包和異步的特性是 支持快速Web開發的利器。
[0004] 閉包是指外部有權訪問另一個函數作用域中變量的函數。對于一般的程序設計語 言,函數內部可直接訪問的都是定義在外部的全局變量,而定義在函數內部的局部變量只 能由該函數使用。JS通過閉包的機制允許外部函數調用一個定義在函數內部的局部變量, 其調用方式是:通過在函數中聲明另一個返回函數,返回需要被調用的變量。閉包的使用可 以保證單個作用域的獨立使用,但也會造成異步調用中變量使用不明確的問題。
[0005] 異步調用是指多個函數的執行并不存在同步順序的關聯,每個函數在接收到參 數被調用時都立即執行,且并不妨礙其它函數的調用執行,函數執行完,通過回調函數即 可返回結果,不需要考慮正在執行的其它函數。JS異步調用中最普遍、最有效的應用是 Ajax (Asynchronous JavaScript and XML,異步 JS 和 XML)。Ajax 允許客戶端異步地發送 請求,而不會阻塞瀏覽器端連續地接收服務器的回應。通過后臺和數據庫進行數據交換, Ajax可以使網頁實現異步更新,這意味著用戶可以在不重新加載整個網頁的情況下,對網 頁的局部內容進行更新;同時在和后臺進行數據交換時,瀏覽器不必處于阻塞狀態,用戶可 以自由地選擇其它的操作。
[0006] 異步調用也存在一些問題,比如不確定性:Ajax中執行回調函數只依據接收到的 回應消息,一旦調用過程中丟失了回應消息,回調函數就會一直處在掛起的狀態,整個服務 都將中斷。這不僅會影響客戶前端的體驗,而且可能產生額外的負載,甚至造成系統的癱 瘓。因此,這種機制雖然能使前端用戶有一個平滑的體驗,但也會由于不可預料的網絡延遲 產生事故。
[0007] 異步調用的問題,從前端用戶的角度上可以看作是原子性違反的問題:用戶通常 默認將一個含異步調用的操作當作是一個連續的事件交互,而當多個異步調用發生沖突, 返回給用戶的信息便會發生錯位,造成用戶不明確具體返回信息和請求操作的對應關系。 Web應用原子性違反指:當一個操作請求發生在兩個本應該連續執行的請求和回應之間 時,使操作的結果與操作順序出現不確定的對應關系,進而產生預期外的競態條件,對用戶 或系統造成顯式的影響。例如=Ajax請求的發送和服務器端的回應之間是可以調用其它函 數的,但當一個Ajax請求中涉及的元素(變量或函數)被其它異步調用使用時,原則上是 不允許的。由于前端用戶的請求是基于事件的,事件間可并行執行,但需要避免原子性違 反,即不能同時調用同一個元素,以免產生沖突、造成混亂。
[0008] 傳統多線程程序原子性違反的檢測方法是觀察代碼與內存訪問中的同步操作,在 有可能發生原子性違反的地方設置觀察點,然后通過靜態分析或者動態運行技術來檢測是 否發生了原子性違反。靜態和動態分析是常用的程序分析技術:靜態分析在不執行程序的 情況下對源代碼進行評估;動態方法則依據執行程序所產生的運行軌跡對程序進行分析。 靜態分析能夠保證對代碼的覆蓋,但由于沒有實際執行數據的參照,會產生誤報;動態的優 勢在于分析的準確性,但缺乏對執行路徑的覆蓋,有漏報的隱患。
[0009] 單獨的靜態或動態方法在JS上實施起來有一定的困難:一方面JS是一個動態語 言,允許程序運行過程中聲明變量和函數,這使得不能僅僅由代碼得到相應的調用過程,并 且JS是基于事件的,事件的調用并不僅僅依托于定義的函數,還涉及HTML頁面中的元素, 單靜態分析是不夠的;另一方面是JS的閉包特性,它對內存訪問的觀察提出了挑戰,因為 大量閉包的使用使得大量局部函數停駐在內存中,動態分析既需要對內存訪問的操作投入 更多的精力,得不償失,又缺乏對代碼的覆蓋。
[0010] 為此,我們提出一種基于靜態分析和動態運行的原子性違反檢測方法:這是一種 結合靜態分析的插粧記錄機制,先通過靜態分析JS代碼,獲取JS中涉及到異步調用的函數 和方法,保證代碼上的覆蓋;跨語言平臺的動態插粧記錄機制,在異步調用函數中設置探測 點,不僅能得到JS程序中的元素,還能記錄HTML代碼中的元素,提高檢測潛在原子性違反 的準確率;根據Web應用請求到回應整個過程中涉及的元素,設計原子性違反判定規則,進 而開展有效的原子性違反檢測。
【發明內容】
[0011] 在現有工作的基礎上,本發明要解決的問題是:克服Web應用請求過程中存在的 JS事件不確定性、請求的跨端性以及同類型請求中共享變量等問題,檢測可能存在的原子 性違反,從而有效保障Web應用的質量。
[0012] 本發明的技術方案為針對Web應用中JS代碼原子性違反檢測,其特征包括:頁面 和事件內部變量及函數的記錄;抽象化原子性操作;設計原子性違反的判定規則;通過插 粧獲取Web應用運行軌跡,使用其中記錄的元素得出具體的判定條件,生成動態分析腳本, 從而有效檢測原子性違反。
[0013] 本發明具體包括以下步驟:
[0014] 1)靜態分析JS代碼,記錄涉及異步調用的元素類型;
[0015] 2)異步調用操作抽象化,劃分模塊,設計原子性違反的判定規則;
[0016] 3) JS代碼插粧,設置函數探測點;
[0017] 4)動態運行Web應用,獲取運行軌跡,生成判定條件,;
[0018] 5)結合運行軌跡中的記錄元素,編寫分析腳本。
[0019] 步驟1)根據已有的MVC(Model View Controller,模型視圖控制器)體系和更具 針對性的JS前端框架請求事件機制,Web應用整個異步調用請求和回應的過程包括:事件 柄登記、HTML元素選中、異步調用參數傳遞、事件請求調用、服務器端操作、回調函數中結果 的返回、瀏覽器端結果的接收、頁面中最終效果的展示等。根據每個階段的內容,記錄異步 調用操作涉及到的元素,包括函數名、方法名、調用中傳遞的參數及回調函數中的語句,以 便后續的分析和處理。
[0020] 本發明先采用靜態方法分析Web應用中JS代碼,記錄異步調用操作涉及到的函 數、方法,這樣不僅能提高代碼覆蓋率,而且能提高檢測的準確率。
[0021] 步驟2)Web應用中原子性違反的檢測,既需要考慮到用戶請求到服務回應流程的 完整性,又要分別處理請求中各階段的不同組成成分。由于頁面和異步調用處理使用的程 序語言不同,頁面采用HTML和CSS語言,異步調用通常使用JS語言,語言間交互的不確定 性使得制定一個統一的符合所有語言特性的原子性違反判定規則成為必需。
[0022] 實際的開發經驗表明,模塊中原子性操作大多處于函數間的調用,而通常函數間 的交互都會涉及到JS操作。因此,可根據JS代碼精確得出原子性操作調用圖,依據Web應 用的缺陷模式,將原子性違反的判定條件細化到具體的元素中。
[0023] 多線程語言Java的靜態分析主要通過WALA (T. J. Watson Libraries forAnalysis)工具實現,WALA是IBM公司T. J. Watson研究中心的一個研究項目,主要功能 是對Java源代碼進行靜態分析,從而獲得程序數據流圖和控制流圖,也可以進行指針分析 和函數調用圖的構造;可對Java字節碼進行分析,提供基于上下文敏感的切片技術。
[0024] JS_WALA是WALA在JS上的實現工具,先將JS代碼轉換成一個標準化形式,再從中 提取程序控制流圖。根據Web應用的整體流程情況,我們利用JS_WALA工具生成一個應用的 異步調用關系圖Graph (Nodes,Edges),其中節點Nodes表示操作中具體的元素,比如:HTML 中的標簽、異步調用中JS函數,邊Edges代表Nodes間異步調用數據或控制流關系。然后, 將關系圖劃分為各個關系塊圖,每個圖中Nodes和Edges定義為一個原子性操作模式,每個 模式都有其對應原子性違反的判定規則。在后期的原子性違反檢測中,使用對應的模式,匹 配出一個應用的疑似含有原子性違反的代碼片段或者程序片段。
[0025] Web應用流程中原子性違反的檢測就是:判定運行軌跡中元素間操作是否滿足各 對應模式的規則。主體JS模塊中函數組成部分包括:
[0026] (1)函數請求參數:函數接口中的請求參數主體是在瀏覽器端與事件柄handle綁 定的一個事件源htmlSource。
[0027] (2)