本發(fā)明涉及無線通信領(lǐng)域,特別涉及一種程序檢測方法及裝置。
背景技術(shù):
隨著無線通信技術(shù)的發(fā)展,無線傳感器網(wǎng)絡(luò)(wirelesssensornetworks,wsns)的應(yīng)用越來越廣泛,具體的,無線傳感器網(wǎng)絡(luò)是由部署在監(jiān)測區(qū)域內(nèi)大量網(wǎng)絡(luò)節(jié)點(diǎn)相互通信形成的多跳自組織網(wǎng)絡(luò)系統(tǒng)。
其中,無線傳感器網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行的程序接收其他網(wǎng)絡(luò)節(jié)點(diǎn)下發(fā)的無線控制指令后,可以執(zhí)行相應(yīng)的代碼內(nèi)容以響應(yīng)該無線控制指令,但是,在響應(yīng)無線控制指令過程中,可能會出現(xiàn)控制流錯誤。其中,控制流錯誤包括:節(jié)點(diǎn)內(nèi)部發(fā)生的控制流錯誤和所下發(fā)的無線控制指令因為數(shù)據(jù)異變而引發(fā)的控制流錯誤,具體的,節(jié)點(diǎn)內(nèi)部發(fā)生控制流錯誤的原因為:在惡劣的環(huán)境中,高能粒子等可能會瞬間改變部件(門電路、sram單元、鎖存器等),這些硬件中的瞬態(tài)故障會反映到軟件中去,可能會引發(fā)數(shù)據(jù)位翻轉(zhuǎn)、寄存器狀態(tài)改變、存儲指令錯誤、程序跑飛等不可預(yù)知的錯誤,這些錯誤會帶來瞬態(tài)故障,進(jìn)而瞬態(tài)故障導(dǎo)致程序中發(fā)生控制流錯誤;而對于所下發(fā)的無線控制指令因為數(shù)據(jù)異變而引發(fā)的控制流錯誤而言:網(wǎng)絡(luò)節(jié)點(diǎn)的硬件發(fā)生錯誤,可能會引發(fā)所下發(fā)的無線控制指令異變,使得軟件作出錯誤的動作。其中,所謂的該瞬態(tài)故障是一種由于外界環(huán)境導(dǎo)致的軟故障,并不意味著網(wǎng)絡(luò)節(jié)點(diǎn)出現(xiàn)了故障。
當(dāng)然,在無線傳感器網(wǎng)絡(luò)以外的其他無線通信網(wǎng)絡(luò),如:無人機(jī)通信網(wǎng)絡(luò)、工業(yè)控制網(wǎng)絡(luò)中,網(wǎng)絡(luò)節(jié)點(diǎn)在響應(yīng)無線控制指令過程中也可能出現(xiàn)控制流錯誤。
那么,如何檢測網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令過程中所發(fā)生的控制流錯誤,是一個亟待解決的問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例的目的在于提供一種程序檢測方法及裝置,以有效檢測網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令過程中所發(fā)生的控制流錯誤。
為到達(dá)上述目的,本發(fā)明實(shí)施例公開了一種程序檢測方法,應(yīng)用于無線通信網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn);所述方法包括:
網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行的程序接收其他網(wǎng)絡(luò)節(jié)點(diǎn)下發(fā)的無線控制指令,其中,所述程序預(yù)先被設(shè)置有第一動態(tài)標(biāo)簽,所述程序由n個基本塊構(gòu)成,每一基本塊被設(shè)置有第一靜態(tài)標(biāo)簽和第二靜態(tài)標(biāo)簽,所述第一靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第一數(shù)據(jù)值,所述第二靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的后繼基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第二數(shù)據(jù)值,所述第一動態(tài)標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第三數(shù)據(jù)值且初始化時全置為1,當(dāng)前基本塊的后繼基本塊為:程序執(zhí)行過程中當(dāng)前基本塊相鄰的下一基本塊;
在執(zhí)行第一基本塊的入口指令之前,將所述第一基本塊的第一靜態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯與運(yùn)算,得到第一類運(yùn)算結(jié)果,所述第一基本塊為所述程序中n個基本塊中的與響應(yīng)所接收到的指令相關(guān)的任一基本塊;
判斷所述第一類運(yùn)算結(jié)果是否為0,如果是,確定所述程序出現(xiàn)屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤,否則,
根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽;
在執(zhí)行所述第一基本塊的出口指令之前的預(yù)定位置的指令之前,將當(dāng)前的第二動態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯或運(yùn)算,得到第二類運(yùn)算結(jié)果,根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽,其中,所述第二動態(tài)標(biāo)簽為預(yù)先為所述程序設(shè)置的,且所述第二動態(tài)標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第四數(shù)據(jù)值且初始化時全置為0;
在執(zhí)行所述第一基本塊的出口指令之前,判斷所述第一基本塊是否為特殊基本塊,如果判斷出所述第一基本塊為特殊基本塊,則判斷當(dāng)前的第二動態(tài)標(biāo)簽是否等于所述第一基本塊的指令標(biāo)簽,若否,確定所述程序出現(xiàn)屬于通信錯誤類型的控制流錯誤,若是,在執(zhí)行完出口指令后初始化當(dāng)前的第二動態(tài)標(biāo)簽,其中,所述特殊基本塊為用于執(zhí)行動作的基本塊,所述指令標(biāo)簽用于預(yù)存其他網(wǎng)絡(luò)節(jié)點(diǎn)所下發(fā)的所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑,伴隨所述無線控制指令的到來而插入到基本塊中,且屬于n+1位的二進(jìn)制數(shù)據(jù)的第五數(shù)據(jù)值;當(dāng)執(zhí)行完畢所述第一基本塊的出口指令時,判斷所述第一基本塊是否為與所述無線控制指令相關(guān)的最后一個基本塊,如果是,初始化當(dāng)前的第 一動態(tài)標(biāo)簽,如果否,根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,并將所述無線控制指令所關(guān)聯(lián)的基本塊中的下一基本塊作為第一基本塊,繼續(xù)執(zhí)行所述在執(zhí)行第一基本塊的入口指令之前,將所述第一基本塊的第一靜態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯與運(yùn)算,得到第一類運(yùn)算結(jié)果的步驟。
具體的,所述第一靜態(tài)標(biāo)簽的n+1位中,最高位為0,第i位為1,其余位均為0,其中,i為當(dāng)前基本塊在所有基本塊中的順序位;
所述第二靜態(tài)標(biāo)簽的n+1位中,最高位為1,第m位為1,其余位為0,m為當(dāng)前基本塊的后繼基本塊在所有基本塊中的順序位;
所述指令標(biāo)簽的n+1位中,最高位為0,第j位為1,其余位為0,其中,j為所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑中的各個基本塊在所有基本塊中的順序位。
具體的,所述根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽,包括:
將所述第一類運(yùn)算結(jié)果的值,確定為當(dāng)前的第一動態(tài)標(biāo)簽;
相應(yīng)的,所述根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽,包括:
將所述第二類運(yùn)算結(jié)果的值,確定為當(dāng)前的第二動態(tài)標(biāo)簽;相應(yīng)的,所述根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,包括:
將所述第一基本塊的第二靜態(tài)標(biāo)簽確定為當(dāng)前的第一動態(tài)標(biāo)簽。
具體的,在任一基本塊中插入用于設(shè)置標(biāo)簽的指令的方式,包括:
對于當(dāng)前基本塊不是特殊基本塊的情況:
在當(dāng)前基本塊的入口指令之前插入test指令:if((g=g&li)==0)error;其中g(shù)為第一動態(tài)標(biāo)簽,li為當(dāng)前基本塊的第一靜態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前的預(yù)定位置的指令之前插入updates指令:s=s‖g;其中s為第二動態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之后插入updateg指令:g=bi;其中bi為當(dāng)前基本塊的第二靜態(tài)標(biāo)簽;
對于當(dāng)前基本塊為特殊基本塊的情況:
在當(dāng)前基本塊的入口指令之前插入test指令:if((g=g&li)==0)error;其中g(shù)為第一動態(tài)標(biāo)簽,li為當(dāng)前基本塊的第一靜態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前的預(yù)定位置的指令之前插入updates指令:s=s‖g;其中s為第二動態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前插入test指令:if(s≠c)error,其中c為指令標(biāo)簽;
在當(dāng)前基本塊的出口指令之后插入updates指令:s=0;
在當(dāng)前基本塊的出口指令之后插入updateg指令:g=bi;其中bi為當(dāng)前基本塊的第二靜態(tài)標(biāo)簽。
為達(dá)到上述目的,本發(fā)明實(shí)施例還公開了一種程序檢測裝置,應(yīng)用于無線通信網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn);所述裝置包括:
無線控制指令接收單元,用于網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行的程序接收其他網(wǎng)絡(luò)節(jié)點(diǎn)下發(fā)的無線控制指令,其中,所述程序預(yù)先被設(shè)置有第一動態(tài)標(biāo)簽,所述程序由n個基本塊構(gòu)成,每一基本塊被設(shè)置有第一靜態(tài)標(biāo)簽和第二靜態(tài)標(biāo)簽,所述第一靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第一數(shù)據(jù)值,所述第二靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的后繼基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第二數(shù)據(jù)值,所述第一動態(tài)標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第三數(shù)據(jù)值且初始化時全置為1,當(dāng)前基本塊的后繼基本塊為:程序執(zhí)行過程中當(dāng)前基本塊相鄰的下一基本塊;
第一類運(yùn)算結(jié)果計算單元,用于在執(zhí)行第一基本塊的入口指令之前,將所述第一基本塊的第一靜態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯與運(yùn)算,得到第一類運(yùn)算結(jié)果,所述第一基本塊為所述程序中n個基本塊中的與響應(yīng)所接收到的指令相關(guān)的任一基本塊;
第一判斷單元,用于判斷所述第一類運(yùn)算結(jié)果是否為0,如果是,執(zhí)行第一結(jié)果確定單元,否則,執(zhí)行第一動態(tài)標(biāo)簽更新單元;
所述第一結(jié)果確定單元,用于確定所述程序出現(xiàn)屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤;
所述第一動態(tài)標(biāo)簽更新單元,用于根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽;
第二動態(tài)標(biāo)簽確定單元,用于在執(zhí)行所述第一基本塊的出口指令之前的預(yù)定位置的指令之前,將當(dāng)前的第二動態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯或運(yùn)算,得到第二類運(yùn)算結(jié)果,根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽,其中,所述第二動態(tài)標(biāo)簽為預(yù)先為所述程序設(shè)置的,且所述第二動態(tài)標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第四數(shù)據(jù)值且初始化時全置為0;
第二判斷單元,用于在執(zhí)行所述第一基本塊的出口指令之前,判斷所述第一基本塊是否為特殊基本塊,如果判斷出所述第一基本塊為特殊基本塊,則執(zhí)行第三判斷單元,如果判斷出所述第一基本塊不是特殊基本塊,則執(zhí)行第四判斷單元;
所述第三判斷單元,用于判斷當(dāng)前的第二動態(tài)標(biāo)簽是否等于所述第一基本塊的指令標(biāo)簽,若否,執(zhí)行第二結(jié)果確定單元,若是,執(zhí)行第二動態(tài)標(biāo)簽初始化單元,其中,所述特殊基本塊為用于執(zhí)行動作的基本塊,所述指令標(biāo)簽用于預(yù)存其他網(wǎng)絡(luò)節(jié)點(diǎn)所下發(fā)的所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑,伴隨所述無線控制指令的到來而插入到基本塊中,且屬于n+1位的二進(jìn)制數(shù)據(jù)的第五數(shù)據(jù)值;
所述第二結(jié)果確定單元,用于確定所述程序出現(xiàn)屬于通信錯誤類型的控制流錯誤,
所述第二動態(tài)標(biāo)簽初始化單元,在執(zhí)行完出口指令后初始化當(dāng)前的第二動態(tài)標(biāo)簽,并觸發(fā)第四判斷單元;
第四判斷單元,用于當(dāng)執(zhí)行完畢所述第一基本塊的出口指令時,判斷所述第一基本塊是否為與所述無線控制指令相關(guān)的最后一個基本塊,如果是,初始化當(dāng)前的第一動態(tài)標(biāo)簽,如果否,根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,并將所述無線控制指令所關(guān)聯(lián)的基本塊中的下一基本塊作為第一基本塊,觸發(fā)所述第一類運(yùn)算結(jié)果計算單元。
具體的,所述第一靜態(tài)標(biāo)簽的n+1位中,最高位為0,第i位為1,其余位均為0,其中,i為當(dāng)前基本塊在所有基本塊中的順序位;
所述第二靜態(tài)標(biāo)簽的n+1位中,最高位為1,第m位為1,其余位為0,m為當(dāng)前基本塊的后繼基本塊在所有基本塊中的順序位;
所述指令標(biāo)簽的n+1位中,最高位為0,第j位為1,其余位為0,其中,j為所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑中的各個基本塊在所有基本塊中的順序位。
具體的,所述第一動態(tài)標(biāo)簽更新單元根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽,包括:
將所述第一類運(yùn)算結(jié)果的值,確定為當(dāng)前的第一動態(tài)標(biāo)簽;
相應(yīng)的,所述第二動態(tài)標(biāo)簽更新單元根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽,包括:
將所述第二類運(yùn)算結(jié)果的值,確定為當(dāng)前的第二動態(tài)標(biāo)簽;
相應(yīng)的,所述第四判斷單元根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,包括:
將所述第一基本塊的第二靜態(tài)標(biāo)簽確定為當(dāng)前的第一動態(tài)標(biāo)簽。
具體的,在任一基本塊中插入用于設(shè)置標(biāo)簽的指令的方式,包括:
對于當(dāng)前基本塊不是特殊基本塊的情況:
在當(dāng)前基本塊的入口指令之前插入test指令:if((g=g&li)==0)error;其中g(shù)為第一動態(tài)標(biāo)簽,li為當(dāng)前基本塊的第一靜態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前的預(yù)定位置的指令之前插入updates指令:s=s‖g;其中s為第二動態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之后插入updateg指令:g=bi;其中bi為當(dāng)前基本塊的第二靜態(tài)標(biāo)簽;
對于當(dāng)前基本塊為特殊基本塊的情況:
在當(dāng)前基本塊的入口指令之前插入test指令:if((g=g&li)==0)error;其中g(shù)為第一動態(tài)標(biāo)簽,li為當(dāng)前基本塊的第一靜態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前的預(yù)定位置的指令之前插入updates指令:s=s‖g;其中s為第二動態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前插入test指令:if(s≠c)error,其中c為指令標(biāo)簽;
在當(dāng)前基本塊的出口指令之后插入updates指令:s=0;
在當(dāng)前基本塊的出口指令之后插入updateg指令:g=bi;其中bi為當(dāng)前基本塊的第二靜態(tài)標(biāo)簽。
綜上可知,本發(fā)明實(shí)施例所述的一種程序檢測方法和裝置,通過對無線通信網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn)所運(yùn)行的程序設(shè)置第一動態(tài)標(biāo)簽和第二動態(tài)標(biāo)簽,對所述程序中的各個基本塊分別設(shè)置第一靜態(tài)標(biāo)簽和第二靜態(tài)標(biāo)簽,同時對下發(fā)的無線控制指令設(shè)置指令標(biāo)簽,進(jìn)而,在響應(yīng)無線控制指令的過程中,執(zhí)行任一基本塊時,基于兩種靜態(tài)標(biāo)簽和第一動態(tài)標(biāo)簽來判斷是否出現(xiàn)屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤,進(jìn)一步的,在執(zhí)行特殊基本塊時,基于兩種靜態(tài)標(biāo)簽、兩種動態(tài)標(biāo)簽和一種指令標(biāo)簽來判斷是否出現(xiàn)屬于通信錯誤類型的控制流錯誤,以在檢測節(jié)點(diǎn)內(nèi)部所產(chǎn)生的控制流錯誤的同時檢測通信過程中的控制流錯誤。可見,通過本方案可以有效檢測網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令過程中所發(fā)生的控制流錯誤。
當(dāng)然,實(shí)施本發(fā)明的任一產(chǎn)品或方法必不一定需要同時達(dá)到以上所述的所有優(yōu)點(diǎn)。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的隨機(jī)比特故障模型中數(shù)據(jù)異變示例圖;
圖2為本發(fā)明實(shí)施例提供的一種程序檢測方法的總體設(shè)計圖;
圖3中的(a)(b)(c)分別為本發(fā)明實(shí)施例提供的第一靜態(tài)標(biāo)簽、第二靜態(tài)標(biāo)簽和指令標(biāo)簽的示意圖;
圖4為本發(fā)明實(shí)施例提供的插入有用于設(shè)置標(biāo)簽的指令的基本塊的示意圖;
圖5為本發(fā)明實(shí)施例提供的插入有用于設(shè)置標(biāo)簽的指令的能夠執(zhí)行動作的 基本塊的示意圖;
圖6為本發(fā)明實(shí)施例提供的一種程序檢測方法的流程示意圖;
圖7為本發(fā)明實(shí)施例提供的一個具體實(shí)施例中冒泡排序的程序代碼。
圖8為圖7所示的冒泡排序程序的流程圖;
圖9為在圖7所示的冒泡排序的某一基本塊插入指令的示例圖;
圖10為本發(fā)明實(shí)施例提供的基本塊內(nèi)部控制流錯誤的示意圖;
圖11為本發(fā)明實(shí)施例提供的基本塊間控制流錯誤的示意圖;
圖12為本發(fā)明實(shí)施例提供的一種程序檢測裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
為了有效檢測網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令過程中所發(fā)生的控制流錯誤,本發(fā)明實(shí)施例提供了一種程序檢測方法及裝置。需要強(qiáng)調(diào)的是,本發(fā)明實(shí)施例所提及的網(wǎng)絡(luò)節(jié)點(diǎn)可以為無線傳感器網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn),當(dāng)然,還可以為無線傳感器網(wǎng)絡(luò)以外的其他無線通信網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn),舉例而言:該無線無線網(wǎng)絡(luò)可以為:無人機(jī)通信網(wǎng)絡(luò)、工業(yè)控制網(wǎng)絡(luò)等等,在此不做窮舉。
為了便于對發(fā)明實(shí)施例所提供的一種程序檢測方法的理解,首先介紹本發(fā)明實(shí)施例所提供的一種程序檢測方法所基于的原理性內(nèi)容。具體介紹如下:
首先,針對于控制流錯誤的實(shí)質(zhì)內(nèi)容的介紹:
網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令的過程中所發(fā)生的控制流錯誤主要包括:節(jié)點(diǎn)內(nèi)部發(fā)生的控制流錯誤和下發(fā)的無線控制指令因為數(shù)據(jù)異變而引發(fā)的控制流錯誤,其中,對于下發(fā)的無線控制指令因為數(shù)據(jù)異變而引發(fā)的節(jié)點(diǎn)程序控制流錯誤,為了描述方便,下述簡稱通信過程中的控制流錯誤。
其中,對于節(jié)點(diǎn)內(nèi)部發(fā)生的瞬態(tài)故障所導(dǎo)致的控制流錯誤而言,現(xiàn)有技術(shù) 通常采用seu(singleeventupset)故障模型來檢測,由于同時發(fā)生兩次或多次瞬態(tài)故障的概率比較低,seu故障模型認(rèn)為,在完成某一次動作的過程中,硬件中只會出現(xiàn)一次瞬態(tài)故障,使得一個數(shù)據(jù)位發(fā)生翻轉(zhuǎn)。而對于通信過程中的控制流錯誤而言,數(shù)據(jù)異變可以包括三種原因:(1)在發(fā)送之前,網(wǎng)絡(luò)節(jié)點(diǎn)寫入出錯;(2)在無線信道中,數(shù)據(jù)出現(xiàn)異變;(3)在接收到數(shù)據(jù)后,讀數(shù)據(jù)出現(xiàn)錯誤;其中,由于在數(shù)據(jù)傳輸過程中,數(shù)據(jù)是以二進(jìn)制的方式進(jìn)行收發(fā)的,那么,當(dāng)數(shù)據(jù)發(fā)生異變的時候,相當(dāng)于某些數(shù)據(jù)位發(fā)生了翻轉(zhuǎn)。
綜上可知,不管是節(jié)點(diǎn)內(nèi)部發(fā)生瞬態(tài)故障,還是通信過程中數(shù)據(jù)異變,最終導(dǎo)致的都是數(shù)據(jù)位發(fā)生翻轉(zhuǎn)。因此,本發(fā)明首先提出了一種隨機(jī)比特故障模型,該模型假定:在節(jié)點(diǎn)執(zhí)行一次動作時,節(jié)點(diǎn)內(nèi)部或通信過程中只會發(fā)生一次瞬態(tài)故障,使數(shù)據(jù)的一位發(fā)生翻轉(zhuǎn),比如控制指令d2,變成了d3,如圖1所示,控制指令d2為11000010,d2的第一位發(fā)生翻轉(zhuǎn)后,變成了11000011,也就是控制指令d3。顯然,這種錯誤的發(fā)生是隨機(jī)的。
并且,節(jié)點(diǎn)內(nèi)部和通信過程所發(fā)生的瞬態(tài)故障可以導(dǎo)致如下五種類控制流錯誤的發(fā)生,其中,第三種錯誤,一部分來自于本身節(jié)點(diǎn)的瞬態(tài)故障,更主要來自于下發(fā)的指令發(fā)生瞬態(tài)故障。具體的,五種控制流錯誤如下:
(1)基本塊內(nèi)部控制流錯誤;
(2)從一個基本塊尾部非法跳到另一個基本塊開頭;
(3)從一個基本塊尾部錯誤跳到另一個基本塊開頭;
(4)一個基本塊的尾部到另一個基本塊的任意位置;
(5)一個基本塊的任意位置到另一個基本塊的任意位置。
其次,對于網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行程序的預(yù)處理如下:
預(yù)先對程序進(jìn)行劃分,并給出如下定義:
基本塊:一些連續(xù)指令的集合,在基本塊的內(nèi)部,程序順序執(zhí)行,不會發(fā)生跳轉(zhuǎn)和調(diào)用等。其中,基本塊的第一條指令為入口,其它基本塊可以通過跳轉(zhuǎn)、調(diào)用等方式進(jìn)入,其它指令不能跳入基本塊,而最后一條指令為程序的出口,可以跳轉(zhuǎn)到其它基本塊,其它指令不能跳出基本塊。
程序流圖:在將程序劃分為基本塊之后,該程序就可以由基本塊集v和基本塊之間連接的“邊”集e組成的圖來表示,即程序流圖(pfg):p={v,e},其中,v={v1,v2,…vi,…,vn},e={e1,e2,…,ei,…,em},vi代表基本塊,邊ei代表從基本塊vi到基本塊vj的分支bri,j。
后繼基本塊:在程序流圖p={v,e},當(dāng)bri,j∈e,定義vj為vi后繼基本塊,并且,vi所有的后續(xù)基本塊的集合,稱為后繼基本塊集,符號為suc(vi)。
再次,針對于各類標(biāo)簽的具體細(xì)節(jié)的介紹:
如圖2所示,本發(fā)明實(shí)施例通過為程序設(shè)置一種動態(tài)標(biāo)簽和兩種靜態(tài)標(biāo)簽來檢測由于節(jié)點(diǎn)內(nèi)部導(dǎo)致的控制流錯誤,在檢測由于節(jié)點(diǎn)內(nèi)部導(dǎo)致的控制流錯誤的基礎(chǔ)上,增加另一種動態(tài)標(biāo)簽和指令標(biāo)簽,以在檢測節(jié)點(diǎn)內(nèi)部所產(chǎn)生的控制流錯誤的同時檢測通信過程中的控制流錯誤,并且,該指令標(biāo)簽在下發(fā)指令的過程中,同時下發(fā)。
其中,檢測由于節(jié)點(diǎn)內(nèi)部導(dǎo)致的控制流錯誤所利用的兩種靜態(tài)標(biāo)簽為:li和bi,li用于標(biāo)識當(dāng)前基本塊信息,bi用于記錄后續(xù)基本塊的信息,而一種動態(tài)標(biāo)簽可以為g,隨著程序執(zhí)行動態(tài)更新,用于記錄程序的運(yùn)行狀態(tài);進(jìn)一步的,為了同時能夠檢測通信過程中的控制流錯誤,增加有動態(tài)標(biāo)簽s和指令標(biāo)簽cj,動態(tài)標(biāo)簽s隨著程序執(zhí)行動態(tài)更新,用于記錄程序的運(yùn)行狀態(tài),而指令標(biāo)簽cj伴隨無線控制指令同時下發(fā)給節(jié)點(diǎn),預(yù)存無線控制指令的執(zhí)行路徑。下面對各個標(biāo)簽進(jìn)行詳細(xì)介紹:
首先假設(shè)在網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行的程序,有n個基本塊,這n個基本模塊分別定義為v1,v2,…vi,…,vn,在這里i是基本塊的標(biāo)號,0≤i≤n,j代表指令編號。
靜態(tài)標(biāo)簽li:用于標(biāo)識當(dāng)前基本塊vi信息。具體的,li共有n+1位,最高位為0,第i位為1,其余位都為0,如圖3(a)所示。
靜態(tài)標(biāo)簽bi:用于標(biāo)識當(dāng)前基本塊vi的后繼基本塊的信息。具體的,bi共有n+1位,最高位始終為1,如果suc(vi)={vm,vk…},如圖3(b)所示。
指令標(biāo)簽cj:用于預(yù)存下發(fā)指令在程序中執(zhí)行到最終輸出時所經(jīng)歷的路徑,伴隨指令的到來同時輸入。具體的,cj共有n+1位。最高位始終為0,如果指令的執(zhí)行路徑包括{vm,vk…},如圖3(c)所示。
動態(tài)標(biāo)簽g:n+1位,在每個基本塊的末尾都會進(jìn)行更新,并且,初始化為全置為1。
動態(tài)標(biāo)簽s:n+1位,在每個基本塊的中間更新,初始化時全置為0。
需要說明的是,本發(fā)明所述各個標(biāo)簽中的二進(jìn)制0和1,僅僅是一種表征。即在電子工程中,對二進(jìn)制0和1還有兩種定義形式,一種是把高電平定義為1、低電平定義為0,另一種定義是把高電平定義為0、低電平定義為1。
最后,對各個標(biāo)簽的插入方法的介紹:
為了能夠檢測節(jié)點(diǎn)內(nèi)部所發(fā)生的控制流錯誤,在程序中的各個基本塊中插入了一些指令,如圖4所示:
其中,test指令:if((g=g&li)==0)error。通過這條指令,可以在基本塊入口處進(jìn)行檢測,并對g信號進(jìn)行更新。
updates指令:s=s‖g。對s信號進(jìn)行更新,使得s信號能夠帶有經(jīng)過的基本塊信息。
updateg指令:g=bi。對g信號進(jìn)行更新,使得g帶有后繼節(jié)點(diǎn)的信息。
更進(jìn)一步的,為了在檢測節(jié)點(diǎn)內(nèi)部所發(fā)生的控制流錯誤的同時檢測通信過程中的控制流錯誤,還需要在用于執(zhí)行動作的基本塊中額外插入一些指令,其中,本發(fā)明實(shí)施例將所述用于執(zhí)行動作的基本塊視作一種特殊基本塊。如圖5所示:
其中,第一處的test、updates、updateg和圖4所示的基本塊是一致的。
第二處的test指令:if(s≠c)error,用于判斷實(shí)際執(zhí)行路徑和預(yù)存的執(zhí)行路徑是否一致。
第二處的updates指令:s=0在每次完成動作之后將s初始化。
基于上述所介紹的原理性內(nèi)容,下面介紹本發(fā)明實(shí)施例所提供的一種程序檢測方法。需要說明的是,本實(shí)施例中,通過一種動態(tài)標(biāo)簽和兩種靜態(tài)標(biāo)簽來檢測屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤;并且通過增加另一種動態(tài)標(biāo)簽和指令標(biāo)簽,在檢測屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤的同時,檢測屬于通信錯誤類型的控制流錯誤,以實(shí)現(xiàn)有效檢測網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令過程中所發(fā)生的控制流錯誤的目的。
需要提前說明的是,本發(fā)明實(shí)施中所述的第一動態(tài)標(biāo)簽為上述的動態(tài)標(biāo)簽g,第一靜態(tài)標(biāo)簽為上述的靜態(tài)標(biāo)簽li,第二靜態(tài)標(biāo)簽為上述的靜態(tài)標(biāo)簽bi,第二動態(tài)標(biāo)簽為上述的動態(tài)標(biāo)簽s,指令標(biāo)簽為上述的指令標(biāo)簽cj。
如圖6所示,本發(fā)明實(shí)施例所提供的一種程序檢測方法可以包括如下步驟:
s101,網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行的程序接收其他網(wǎng)絡(luò)節(jié)點(diǎn)下發(fā)的無線控制指令;
其中,所述程序預(yù)先被設(shè)置有第一動態(tài)標(biāo)簽,所述程序由n個基本塊構(gòu)成,每一基本塊被設(shè)置有第一靜態(tài)標(biāo)簽和第二靜態(tài)標(biāo)簽,所述第一靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第一數(shù)據(jù)值,所述第二靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的后繼基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第二數(shù)據(jù)值,所述第一動態(tài)標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第三數(shù)據(jù)值且初始化時全置為1,當(dāng)前基本塊的后繼基本塊為:程序執(zhí)行過程中當(dāng)前基本塊相鄰的下一基本塊。
具體的,所述第一靜態(tài)標(biāo)簽的n+1位中,最高位為0,第i位為1,其余位均為0,其中,i為當(dāng)前基本塊在所有基本塊中的順序位。并且,關(guān)于第一靜態(tài)標(biāo)簽的具體示意圖可以參見圖3(a)。
具體的,所述第二靜態(tài)標(biāo)簽的n+1位中,最高位為1,第m位為1,其余位為0,m為當(dāng)前基本塊的后繼基本塊在所有基本塊中的順序位。并且,關(guān)于第二靜態(tài)標(biāo)簽的具體示意圖可以參見圖3(b)。
需要說明的是,所述程序預(yù)先被劃分為多個基本塊的方法可以利用現(xiàn)有技術(shù)實(shí)現(xiàn),在此不再贅述。
s102,在執(zhí)行第一基本塊的入口指令之前,將所述第一基本塊的第一靜態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯與運(yùn)算,得到第一類運(yùn)算結(jié)果,所述第一基本塊為所述程序中n個基本塊中的與響應(yīng)所接收到的指令相關(guān)的任一基本塊;
s103,判斷所述第一類運(yùn)算結(jié)果是否為0,如果是,執(zhí)行s104,否則,執(zhí)行s105;
s104,確定所述程序出現(xiàn)屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤;
s105,根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽;
具體的,所述根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽,包括:將所述第一類運(yùn)算結(jié)果的值,確定為當(dāng)前的第一動態(tài)標(biāo)簽。
在實(shí)際應(yīng)用中,在所述程序正確執(zhí)行的情況下,由于當(dāng)前的第一動態(tài)標(biāo)簽g 在上一個基本塊的尾部更新時記錄了所述上一基本塊的后繼基本塊的信息,因此在執(zhí)行第一基本塊的入口指令之前,執(zhí)行test指令,將所述第一基本塊的第一靜態(tài)標(biāo)簽li與當(dāng)前的第一動態(tài)標(biāo)簽g進(jìn)行邏輯與運(yùn)算時,得到的第一類運(yùn)算結(jié)果不會為0。如果得到的第一類運(yùn)算結(jié)果為0,則說明所述程序出現(xiàn)了屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤。將所述第一基本塊的第一靜態(tài)標(biāo)簽li與當(dāng)前的第一動態(tài)標(biāo)簽g進(jìn)行邏輯與運(yùn)算時,得到的第一類運(yùn)算結(jié)果即為所述第一基本塊的第一靜態(tài)標(biāo)簽li的值。根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽g,也就是將第一靜態(tài)標(biāo)簽li的值賦給了第一動態(tài)標(biāo)簽g。
s106,在執(zhí)行所述第一基本塊的出口指令之前的預(yù)定位置的指令之前,將當(dāng)前的第二動態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯或運(yùn)算,得到第二類運(yùn)算結(jié)果,根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽;
具體的,所述第二動態(tài)標(biāo)簽為預(yù)先為所述程序設(shè)置的,且所述第二動態(tài)標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第四數(shù)據(jù)值且初始化時全置為0。
具體的,所述根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽,包括:將所述第二類運(yùn)算結(jié)果的值,確定為當(dāng)前的第二動態(tài)標(biāo)簽。
需要說明的是,所述第一基本塊的出口指令之前的預(yù)定位置的指令可以是所述第一基本塊的出口指令之前的任一指令。在執(zhí)行到所述第一基本塊的出口指令之前的任一指令之前,例如執(zhí)行到所述第一基本塊的中部時,執(zhí)行updates指令,將當(dāng)前的第二動態(tài)標(biāo)簽s和當(dāng)前的第一動態(tài)標(biāo)簽g進(jìn)行邏輯或運(yùn)算,得到第二類運(yùn)算結(jié)果,并將所述第二類運(yùn)算結(jié)果的值賦給當(dāng)前的第二動態(tài)標(biāo)簽s。
s107,在執(zhí)行所述第一基本塊的出口指令之前,判斷所述第一基本塊是否為特殊基本塊,如果判斷出所述第一基本塊為特殊基本塊,執(zhí)行s108;如果判斷出所述第一基本塊不是特殊基本塊,直接執(zhí)行s111;
具體的,所述特殊基本塊為用于執(zhí)行動作的基本塊;所述指令標(biāo)簽用于預(yù)存其他網(wǎng)絡(luò)節(jié)點(diǎn)所下發(fā)的所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑,伴隨所述無線控制指令的到來而插入到基本塊中,且屬于n+1位的二進(jìn)制數(shù)據(jù)的第五數(shù)據(jù)值,所述指令標(biāo)簽n+1位中,最高位為0,第j位為1,其余位為0,其中,j為所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑中的各個基本塊在所有基本塊中的順序位。并且,關(guān)于指令標(biāo)簽的具體示意圖可以參見圖 3(c)。
s108,判斷當(dāng)前的第二動態(tài)標(biāo)簽是否等于所述第一基本塊的指令標(biāo)簽;
在實(shí)際應(yīng)用中,判斷當(dāng)前的第二動態(tài)標(biāo)簽是否等于所述第一基本塊的指令標(biāo)簽,例如執(zhí)行第二處的test指令,通過判斷當(dāng)前的第二動態(tài)標(biāo)簽s是否等于所述第一基本塊的指令標(biāo)簽cj,來判斷所述無線控制指令的實(shí)際執(zhí)行路徑和預(yù)存的執(zhí)行路徑是否一致。
s109,確定所述程序出現(xiàn)屬于通信錯誤類型的控制流錯誤;
在實(shí)際應(yīng)用中,在程序執(zhí)行到特殊基本塊時,如果程序是正確執(zhí)行的,并且下發(fā)的控制指令沒有發(fā)生異變時,當(dāng)前的第二動態(tài)標(biāo)簽s的值與預(yù)存的指令標(biāo)簽cj的值是相等的。否則,如果程序并沒有經(jīng)過該有的路徑執(zhí)行,或者下發(fā)的控制指令出現(xiàn)異變,那么當(dāng)前的第二動態(tài)標(biāo)簽s的值與預(yù)存的指令標(biāo)簽cj的值是不相等,確定程序出現(xiàn)屬于通信錯誤類型的控制流錯誤。
s110,在執(zhí)行完出口指令后初始化當(dāng)前的第二動態(tài)標(biāo)簽,并執(zhí)行s111;
s111,當(dāng)執(zhí)行完畢所述第一基本塊的出口指令時,判斷所述第一基本塊是否為與所述無線控制指令相關(guān)的最后一個基本塊,如果是,執(zhí)行s112,如果否,執(zhí)行s113;
s112,初始化當(dāng)前的第一動態(tài)標(biāo)簽;
s113,根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,并將所述無線控制指令所關(guān)聯(lián)的基本塊中的下一基本塊作為第一基本塊,返回s102。
具體的,所述根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,包括:將所述第一基本塊的第二靜態(tài)標(biāo)簽確定為當(dāng)前的第一動態(tài)標(biāo)簽。
在實(shí)際應(yīng)用中,根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,例如執(zhí)行updateg指令,將所述第一基本塊的第二靜態(tài)標(biāo)簽bi的值賦給了當(dāng)前的第一動態(tài)標(biāo)簽g,對當(dāng)前的第一動態(tài)標(biāo)簽g進(jìn)行更新,使得當(dāng)前的第一動態(tài)標(biāo)簽g帶有所述第一基本塊的后繼基本塊的信息。
本發(fā)明實(shí)施例所述的程序檢測方法,通過對無線通信網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn)所 運(yùn)行的程序設(shè)置第一動態(tài)標(biāo)簽和第二動態(tài)標(biāo)簽,對所述程序中的各個基本塊分別設(shè)置第一靜態(tài)標(biāo)簽和第二靜態(tài)標(biāo)簽,同時對下發(fā)的無線控制指令設(shè)置指令標(biāo)簽,進(jìn)而,在響應(yīng)無線控制指令的過程中,執(zhí)行任一基本塊時,基于兩種靜態(tài)標(biāo)簽和第一動態(tài)標(biāo)簽來判斷是否出現(xiàn)屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤,進(jìn)一步的,在執(zhí)行特殊基本塊時,基于兩種靜態(tài)標(biāo)簽、兩種動態(tài)標(biāo)簽和一種指令標(biāo)簽來判斷是否出現(xiàn)屬于通信錯誤類型的控制流錯誤,以在檢測節(jié)點(diǎn)內(nèi)部所產(chǎn)生的控制流錯誤的同時檢測通信過程中的控制流錯誤??梢姡ㄟ^本方案可以有效檢測網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令過程中所發(fā)生的控制流錯誤。
下面以冒泡排序作為具體應(yīng)用實(shí)例,對本發(fā)明實(shí)施例所提供的一種程序檢測方法進(jìn)行介紹,該具體應(yīng)用實(shí)例中能夠檢測由于節(jié)點(diǎn)內(nèi)部導(dǎo)致的控制流錯誤以及下發(fā)的無線控制指令因為數(shù)據(jù)異變而引發(fā)的程序中的控制流錯誤。
網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行的程序響應(yīng)無線控制指令過程中產(chǎn)生的控制流錯誤可以包括節(jié)點(diǎn)內(nèi)部本身發(fā)生的控制流錯誤,以及下發(fā)的指令因為數(shù)據(jù)異變而引發(fā)的節(jié)點(diǎn)程序控制流錯誤。為了在程序中能夠體現(xiàn),可以在冒泡排序的基礎(chǔ)上,對程序進(jìn)行了修改。為了簡化分析過程,可以只考慮有兩種指令的狀況,并用輸出打印數(shù)據(jù)來表示節(jié)點(diǎn)執(zhí)行動作。修改后的程序如圖7所示。
根據(jù)修改后冒泡排序的代碼,結(jié)合給出的定義,冒泡排序的流程圖可以如圖8所示,在這個程序中,基本塊的個數(shù)n=7,其中,v1,v2,……v7等代表基本塊,v2的后繼基本塊為suc(v2)={v3,v4},圖中所示的特殊基本塊v6、v7是用于執(zhí)行動作的基本塊。
各類標(biāo)簽的具體數(shù)據(jù)信息舉例如下:
l2=00000010:用于標(biāo)識v2的信息;
b2=10001100:用于標(biāo)識v2的后繼基本塊的信息;
c1=00111111:指令c1需要經(jīng)過基本塊(v1,v2,v3,v4,v5,v6)。
標(biāo)簽插入方法舉例如下:
針對基本塊v3,標(biāo)簽插入方法如圖9所示。
冒泡程序算法執(zhí)行流程如下:
對于該冒泡程序,對于v1基本塊,g初始化為11111111,正確執(zhí)行完v1后,g=b1=10000010,如果正常跳轉(zhuǎn)到v2入口處,則g=g&l2=10000010&00000010=00000010≠0,沒有錯。否則,如果從基本塊v1出口處跳轉(zhuǎn)到基本塊v3處,那么在基本塊v3中開始執(zhí)行測試指令g=g&l3=10000010&00000100=0,檢測到錯誤。
對于指令c=1,當(dāng)其正確執(zhí)行時,s=00111111,那么開始時,c1預(yù)存的值就是00111111。類似c2的預(yù)存的值為01011111。那么如果由于指令數(shù)據(jù)異變,指令從c=1變成了c=2,那么由于s=01011111不等于預(yù)存的c1值,檢測出錯誤。另外如果在程序執(zhí)行的過程中,程序流程出現(xiàn)錯誤,例如從v2直接跳到了v6,s=00100011,也不等于預(yù)存的值,能夠檢測出控制流錯誤。
進(jìn)一步的,為了便于對本發(fā)明實(shí)施例所提供的方法的理解,下面結(jié)合具體的錯誤類型,介紹本發(fā)明實(shí)施例所提供方法對節(jié)點(diǎn)內(nèi)部的控制流錯誤的檢測過程。
本發(fā)明實(shí)施例所提供程序檢測方法對節(jié)點(diǎn)內(nèi)部的控制流錯誤的檢測過程可以為:
(1)基本塊內(nèi)部能夠發(fā)生的控制流錯誤的檢測:
基本塊內(nèi)部能夠發(fā)生的控制流錯誤,如圖10所示,虛線代表錯誤的跳轉(zhuǎn)方式。
錯誤類型1:從基本塊的上部跳到上部,或者從基本塊的下部跳到下部。
錯誤類型2:從基本塊的上部跳到下部。
錯誤類型3:從基本塊的下部跳到上部。
基本塊內(nèi)部的錯誤發(fā)生的概率很小,特別是針對程序規(guī)模較小的情況。那么顯然錯誤類型1發(fā)生的概率更加的小。
當(dāng)錯誤類型2發(fā)生時,本發(fā)明所提供方法無法檢測出來,但是此時程序很可能陷入死循環(huán),本身程序也就不會繼續(xù)執(zhí)行下去了,那么不會導(dǎo)致節(jié)點(diǎn)發(fā)生錯誤的輸出。
當(dāng)錯誤3發(fā)生,那么其中updates語句沒有執(zhí)行,也就是說s信號不能夠帶走這個模塊的位置信息,那么他所記錄的路徑就發(fā)生了錯誤,那么在輸出之前與預(yù)存的cj值作比較的時候,能夠檢測出來。
(2)基本塊間控制流錯誤的檢測:
基本塊間錯誤類型如圖11所示。實(shí)線代表可以正確的跳轉(zhuǎn),虛線代表錯誤的跳轉(zhuǎn)方式。
錯誤類型4:從一個基本塊vi的出口錯誤跳轉(zhuǎn)另一個基本塊的入口vj,vj屬于suc(vi)。這種錯誤是由于條件分支語句本身“條件”判斷出錯,是數(shù)據(jù)流錯誤引發(fā)的控制流錯誤。這種錯誤來源有兩個,一種是節(jié)點(diǎn)內(nèi)部數(shù)據(jù)出錯,此時執(zhí)行完updates后,s記錄的路徑與指令標(biāo)簽中的值不符,可以檢測出來。另一種是主要來源,是因為下發(fā)指令在通信過程中異變導(dǎo)致的,將在下面對通信過程中的控制流錯誤的檢測過程中具體講述。
錯誤類型5:從一個基本塊的出口,非法跳轉(zhuǎn)到另一個基本塊的任意位置,vj屬于suc(vi)。這種錯誤需要分兩種類型來考慮,一種是跳轉(zhuǎn)到基本塊的上部,這時候,由于test指令沒有執(zhí)行,g的最高位為1,在執(zhí)行完updates,s的n+1位為1,最后與cj值做比較后,能夠檢測出錯誤。另一種是跳轉(zhuǎn)到基本塊的下部,這時候由于沒有執(zhí)行updates,s無法記錄下此時執(zhí)行路徑的信息。那么到了最后與cj值做比較后,能夠檢測出錯誤。
錯誤類型6:從一個基本塊的任意位置,非法跳轉(zhuǎn)到另一個基本塊的入口,vj屬于suc(vi)。由于g信號沒有更新,所以在入口處,執(zhí)行test指令時,能夠檢測出錯誤。
錯誤類型7:從一個基本塊的任意位置,非法跳轉(zhuǎn)到另一個基本塊的任意位置,vj屬于suc(vi)。這種錯誤分四種情況。第一種,從一個基本塊的上部跳到另一個基本塊的上部,那么此時由于在vj中,由于g信號沒有更新,updates執(zhí)行后值記錄了vi的信息,沒有記錄的vj信息。第二種從一個基本塊的上部跳到另一個基本塊的下部,vi、vj的信息都沒有辦法記錄。第三種從一個基本塊的下部跳到另一個基本塊的上部,與第一種情況一樣。第四種從一個基本塊的下部跳到另一個基本塊的下部,此時s信號不能記錄vj的信息。所以這四種情況都 可以檢測出來。
錯誤類型8:從一個基本塊的出口,非法跳轉(zhuǎn)到另一個基本塊的入口,vj不屬于suc(vi)。這時候在執(zhí)行test指令時能夠檢測出錯誤。
錯誤類型9:從一個基本塊的任意位置,非法跳轉(zhuǎn)到另一個基本塊的出口,vj不屬于suc(vi)。同類型8。
錯誤類型10:從一個基本塊的出口,非法跳轉(zhuǎn)到另一個基本塊的任意位置,vj不屬于suc(vi)。
錯誤類型11:從一個基本塊的任意位置,非法跳轉(zhuǎn)到另一個基本塊的任意位置,vj不屬于suc(vi)。同類型10。
同樣的,為了便于對本發(fā)明實(shí)施例所提供的方法的理解,下面進(jìn)一步介紹本發(fā)明實(shí)施例所提供方法對通信過程中的控制流錯誤的檢測過程。
本發(fā)明實(shí)施例所提供程序檢測方法對通信過程中的控制流錯誤的檢測過程可以為:
指令異變后,在故障傳入節(jié)點(diǎn)后,會導(dǎo)致上面所說的錯誤類型4。如果變成的指令在節(jié)點(diǎn)內(nèi)部程序中不存在,此時節(jié)點(diǎn)不會執(zhí)行任何動作,沒有錯誤輸出。如果變成的指令在節(jié)點(diǎn)內(nèi)部存在,節(jié)點(diǎn)內(nèi)部程序不能按照指令標(biāo)簽中預(yù)存的執(zhí)行流程去執(zhí)行程序,此時updates后,動態(tài)標(biāo)簽s記錄的執(zhí)行路徑和指令標(biāo)簽預(yù)存的路徑不相符,可以檢測出來。
在上面的分析中沒有考慮到同時通信中有檢驗的狀況,下面我們考慮有檢驗的狀況,以crc舉例。
在有crc檢驗時,有三種情況。
1)指令發(fā)生數(shù)據(jù)異變的三種錯誤中,在發(fā)送之前網(wǎng)絡(luò)節(jié)點(diǎn)寫入出錯和在接收到數(shù)據(jù)后讀數(shù)據(jù)出錯這兩種情況并沒有辦法檢測出來;
2)crc檢驗的并不能完全檢驗出錯誤,檢測概率一般為99.7%,而針對可靠性要求非常高的指令數(shù)據(jù),增加檢驗是有必要的;
3)在crc用軟件實(shí)現(xiàn)時,本身的程序也可能出現(xiàn)錯誤。
所以在有crc檢驗時,針對可靠性要求非常高的指令數(shù)據(jù),增加檢驗是有 必要的。而且本發(fā)明所述的指令標(biāo)簽不僅僅是用于檢測下發(fā)指令的正確性,而且用于預(yù)存指令的執(zhí)行路徑,確保程序是按正確的路徑到達(dá)需要執(zhí)行動作的位置。上述分析可以知道,本發(fā)明實(shí)施例所提供方法在有校驗的時候也很有價值。
相應(yīng)于上述的方法實(shí)施例,本發(fā)明實(shí)施例還提供了一種程序檢測裝置。如圖12所示,該裝置可以包括:
無線控制指令接收單元1201,用于網(wǎng)絡(luò)節(jié)點(diǎn)中運(yùn)行的程序接收其他網(wǎng)絡(luò)節(jié)點(diǎn)下發(fā)的無線控制指令,其中,所述程序預(yù)先被設(shè)置有第一動態(tài)標(biāo)簽,所述程序由n個基本塊構(gòu)成,每一基本塊被設(shè)置有第一靜態(tài)標(biāo)簽和第二靜態(tài)標(biāo)簽,所述第一靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第一數(shù)據(jù)值,所述第二靜態(tài)標(biāo)簽為用于標(biāo)識當(dāng)前基本塊的后繼基本塊的信息且屬于n+1位的二進(jìn)制數(shù)據(jù)的第二數(shù)據(jù)值,所述第一動態(tài)標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第三數(shù)據(jù)值且初始化時全置為1,當(dāng)前基本塊的后繼基本塊為:程序執(zhí)行過程中當(dāng)前基本塊相鄰的下一基本塊;
第一類運(yùn)算結(jié)果計算單元1202,用于在執(zhí)行第一基本塊的入口指令之前,將所述第一基本塊的第一靜態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯與運(yùn)算,得到第一類運(yùn)算結(jié)果,所述第一基本塊為所述程序中n個基本塊中的與響應(yīng)所接收到的指令相關(guān)的任一基本塊;
第一判斷單元1203,用于判斷所述第一類運(yùn)算結(jié)果是否為0,如果是,執(zhí)行第一結(jié)果確定單元1204,否則,執(zhí)行第一動態(tài)標(biāo)簽更新單元1205;
所述第一結(jié)果確定單元1204,用于確定所述程序出現(xiàn)屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤;
所述第一動態(tài)標(biāo)簽更新單元1205,用于根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng)前的第一動態(tài)標(biāo)簽;
第二動態(tài)標(biāo)簽確定單元1206,用于在執(zhí)行所述第一基本塊的出口指令之前的預(yù)定位置的指令之前,將當(dāng)前的第二動態(tài)標(biāo)簽和當(dāng)前的第一動態(tài)標(biāo)簽進(jìn)行邏輯或運(yùn)算,得到第二類運(yùn)算結(jié)果,根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽,其中,所述第二動態(tài)標(biāo)簽為預(yù)先為所述程序設(shè)置的,且所述第二動態(tài) 標(biāo)簽為屬于n+1位的二進(jìn)制數(shù)據(jù)的第四數(shù)據(jù)值且初始化時全置為0;
第二判斷單元1207,用于在執(zhí)行所述第一基本塊的出口指令之前,判斷所述第一基本塊是否為特殊基本塊,如果判斷出所述第一基本塊為特殊基本塊,則執(zhí)行第三判斷單元1208,如果判斷出所述第一基本塊不是特殊基本塊,則執(zhí)行第四判斷單元1211;
所述第三判斷單元1208,用于判斷當(dāng)前的第二動態(tài)標(biāo)簽是否等于所述第一基本塊的指令標(biāo)簽,若否,執(zhí)行第二結(jié)果確定單元1209,若是,執(zhí)行第二動態(tài)標(biāo)簽初始化單元1210,其中,所述特殊基本塊為用于執(zhí)行動作的基本塊,所述指令標(biāo)簽用于預(yù)存其他網(wǎng)絡(luò)節(jié)點(diǎn)所下發(fā)的所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑,伴隨所述無線控制指令的到來而插入到基本塊中,且屬于n+1位的二進(jìn)制數(shù)據(jù)的第五數(shù)據(jù)值;
所述第二結(jié)果確定單元1209,用于確定所述程序出現(xiàn)屬于通信錯誤類型的控制流錯誤,
所述第二動態(tài)標(biāo)簽初始化單元1210,在執(zhí)行完出口指令后初始化當(dāng)前的第二動態(tài)標(biāo)簽,并觸發(fā)第四判斷單元1211;
第四判斷單元1211,用于當(dāng)執(zhí)行完畢所述第一基本塊的出口指令時,判斷所述第一基本塊是否為與所述無線控制指令相關(guān)的最后一個基本塊,如果是,初始化當(dāng)前的第一動態(tài)標(biāo)簽,如果否,根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,并將所述無線控制指令所關(guān)聯(lián)的基本塊中的下一基本塊作為第一基本塊,觸發(fā)所述第一類運(yùn)算結(jié)果計算單元1202。
具體的,所述第一靜態(tài)標(biāo)簽的n+1位中,最高位為0,第i位為1,其余位均為0,其中,i為當(dāng)前基本塊在所有基本塊中的順序位;
所述第二靜態(tài)標(biāo)簽的n+1位中,最高位為1,第m位為1,其余位為0,m為當(dāng)前基本塊的后繼基本塊在所有基本塊中的順序位;
所述指令標(biāo)簽的n+1位中,最高位為0,第j位為1,其余位為0,其中,j為所述無線控制指令在程序中執(zhí)行到最終輸出時所經(jīng)歷路徑中的各個基本塊在所有基本塊中的順序位。
具體的,所述第一動態(tài)標(biāo)簽更新單元1205根據(jù)所述第一類運(yùn)算結(jié)果更新當(dāng) 前的第一動態(tài)標(biāo)簽,包括:
將所述第一類運(yùn)算結(jié)果的值,確定為當(dāng)前的第一動態(tài)標(biāo)簽;
相應(yīng)的,所述第二動態(tài)標(biāo)簽更新單元1206根據(jù)所述第二類運(yùn)算結(jié)果更新當(dāng)前的第二動態(tài)標(biāo)簽,包括:
將所述第二類運(yùn)算結(jié)果的值,確定為當(dāng)前的第二動態(tài)標(biāo)簽;相應(yīng)的,所述第四判斷單元1211根據(jù)所述第一基本塊的第二靜態(tài)標(biāo)簽更新當(dāng)前的第一動態(tài)標(biāo)簽,包括:
將所述第一基本塊的第二靜態(tài)標(biāo)簽確定為當(dāng)前的第一動態(tài)標(biāo)簽。
具體的,在任一基本塊中插入用于設(shè)置標(biāo)簽的指令的方式,包括:
對于當(dāng)前基本塊不是特殊基本塊的情況:
在當(dāng)前基本塊的入口指令之前插入test指令:if((g=g&li)==0)error;其中g(shù)為第一動態(tài)標(biāo)簽,li為當(dāng)前基本塊的第一靜態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前的預(yù)定位置的指令之前插入updates指令:s=s‖g;其中s為第二動態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之后插入updateg指令:g=bi;其中bi為當(dāng)前基本塊的第二靜態(tài)標(biāo)簽;
對于當(dāng)前基本塊為特殊基本塊的情況:
在當(dāng)前基本塊的入口指令之前插入test指令:if((g=g&li)==0)error;其中g(shù)為第一動態(tài)標(biāo)簽,li為當(dāng)前基本塊的第一靜態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前的預(yù)定位置的指令之前插入updates指令:s=s‖g;其中s為第二動態(tài)標(biāo)簽;
在當(dāng)前基本塊的出口指令之前插入test指令:if(s≠c)error,其中c為指令標(biāo)簽;
在當(dāng)前基本塊的出口指令之后插入updates指令:s=0;
在當(dāng)前基本塊的出口指令之后插入updateg指令:g=bi;其中bi為當(dāng)前基本塊的第二靜態(tài)標(biāo)簽。
對于裝置實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡 單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
本發(fā)明實(shí)施例所述的程序檢測裝置,通過對無線通信網(wǎng)絡(luò)中的網(wǎng)絡(luò)節(jié)點(diǎn)所運(yùn)行的程序設(shè)置第一動態(tài)標(biāo)簽和第二動態(tài)標(biāo)簽,對所述程序中的各個基本塊分別設(shè)置第一靜態(tài)標(biāo)簽和第二靜態(tài)標(biāo)簽,同時對下發(fā)的無線控制指令設(shè)置指令標(biāo)簽,進(jìn)而,在響應(yīng)無線控制指令的過程中,執(zhí)行任一基本塊時,基于兩種靜態(tài)標(biāo)簽和第一動態(tài)標(biāo)簽來判斷是否出現(xiàn)屬于節(jié)點(diǎn)內(nèi)部錯誤類型的控制流錯誤,進(jìn)一步的,在執(zhí)行特殊基本塊時,基于兩種靜態(tài)標(biāo)簽、兩種動態(tài)標(biāo)簽和一種指令標(biāo)簽來判斷是否出現(xiàn)屬于通信錯誤類型的控制流錯誤,以在檢測節(jié)點(diǎn)內(nèi)部所產(chǎn)生的控制流錯誤的同時檢測通信過程中的控制流錯誤??梢?,通過本方案可以有效檢測網(wǎng)絡(luò)節(jié)點(diǎn)中的程序在響應(yīng)無線控制指令過程中所發(fā)生的控制流錯誤。
需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實(shí)體或者操作與另一個實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。
本說明書中的各個實(shí)施例均采用相關(guān)的方式描述,各個實(shí)施例之間相同相似的部分互相參見即可,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對于裝置實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述方法實(shí)施方式中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以存儲于計算機(jī)可讀取存儲介質(zhì)中,這里所稱得的存儲介質(zhì),如:rom/ram、磁碟、光盤等。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均包含在本發(fā)明的保護(hù)范圍內(nèi)。