亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

靜態(tài)代碼掃描結(jié)果處理方法和裝置與流程

文檔序號(hào):12469944閱讀:629來(lái)源:國(guó)知局
靜態(tài)代碼掃描結(jié)果處理方法和裝置與流程

本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種靜態(tài)代碼掃描結(jié)果處理方法和裝置。



背景技術(shù):

項(xiàng)目測(cè)試開(kāi)發(fā)過(guò)程中,需要通過(guò)靜態(tài)代碼掃描來(lái)檢查項(xiàng)目代碼質(zhì)量。其中,靜態(tài)代碼掃描指的是在不運(yùn)行代碼的方式下,通過(guò)文本分析和正則匹配等技術(shù)掃描程序代碼,發(fā)現(xiàn)代碼中存在的規(guī)范性、安全性問(wèn)題的技術(shù),輸出項(xiàng)目代碼的掃描報(bào)錯(cuò)。常用的靜態(tài)代碼掃描工具有TscanCode、Cppcheck、Cpplint和ReSharper等等。

項(xiàng)目代碼每完成一次掃描,會(huì)輸出一個(gè)掃描結(jié)果,掃描結(jié)果中包括若干條掃描報(bào)錯(cuò)。項(xiàng)目代碼進(jìn)行修改后形成新的版本,對(duì)新版本再次掃描時(shí),會(huì)得到新的掃描結(jié)果。然而,現(xiàn)有的掃描工具只能提供每個(gè)版本的項(xiàng)目代碼的掃描結(jié)果,不能提供不同版本的項(xiàng)目代碼的掃描結(jié)果之間的對(duì)比。由于項(xiàng)目代碼會(huì)在不同版本的開(kāi)發(fā)迭代過(guò)程中發(fā)生變化,如代碼的上下文、注釋和行號(hào)等發(fā)生變化,而這些變化會(huì)導(dǎo)致掃描報(bào)錯(cuò)的相關(guān)信息(例如報(bào)錯(cuò)位置、報(bào)錯(cuò)說(shuō)明等)發(fā)生變更,進(jìn)一步導(dǎo)致識(shí)別項(xiàng)目代碼中的新增的掃描報(bào)錯(cuò)和已修復(fù)的掃描報(bào)錯(cuò)出現(xiàn)困難。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明實(shí)施例提供了一種靜態(tài)代碼掃描結(jié)果處理方法和裝置,能夠?qū)崿F(xiàn)對(duì)目標(biāo)代碼的報(bào)錯(cuò)跟蹤的閉環(huán)管理。

第一方面,本發(fā)明實(shí)施例提供一種靜態(tài)代碼掃描結(jié)果處理方法,包括:

獲取第一報(bào)錯(cuò),所述第一報(bào)錯(cuò)為對(duì)目標(biāo)代碼的一次靜態(tài)掃描結(jié)果中的一個(gè)報(bào)錯(cuò);

根據(jù)所述第一報(bào)錯(cuò)生成第一散列值;

根據(jù)所述第一散列值在歷史報(bào)錯(cuò)記錄表中查找第二散列值,所述第二散列值為與所述第一散列值指示同一個(gè)報(bào)錯(cuò)的散列值,其中,所述歷史報(bào)錯(cuò)記錄表中存有所述目標(biāo)代碼的歷史靜態(tài)掃描結(jié)果中各報(bào)錯(cuò)的散列值以及報(bào)錯(cuò)ID,其中,所述報(bào)錯(cuò)的報(bào)錯(cuò)ID用于唯一標(biāo)識(shí)所述報(bào)錯(cuò)的散列值;

當(dāng)查找到所述第二散列值時(shí),將所述第一散列值的報(bào)錯(cuò)ID取值為所述第二散列值的報(bào)錯(cuò)ID。

第二方面,本發(fā)明實(shí)施例提供一種靜態(tài)代碼掃描結(jié)果處理裝置,包括:

獲取模塊,用于獲取第一報(bào)錯(cuò),所述第一報(bào)錯(cuò)為對(duì)目標(biāo)代碼的一次靜態(tài)掃描結(jié)果中的一個(gè)報(bào)錯(cuò);

生成模塊,用于根據(jù)所述第一報(bào)錯(cuò)生成第一散列值;

查找模塊,用于根據(jù)所述第一散列值在歷史報(bào)錯(cuò)記錄表中查找第二散列值,所述第二散列值為與所述第一散列值指示同一個(gè)報(bào)錯(cuò)的散列值,其中,所述歷史報(bào)錯(cuò)記錄表中存有所述目標(biāo)代碼的歷史靜態(tài)掃描結(jié)果中各報(bào)錯(cuò)的散列值以及報(bào)錯(cuò)ID,其中,所述報(bào)錯(cuò)的報(bào)錯(cuò)ID用于唯一標(biāo)識(shí)所述報(bào)錯(cuò)的散列值;

取值模塊,用于當(dāng)查找到所述第二散列值時(shí),將所述第一散列值的報(bào)錯(cuò)ID取值為所述第二散列值的報(bào)錯(cuò)ID。

從以上技術(shù)方案可以看出,本發(fā)明實(shí)施例具有以下優(yōu)點(diǎn):

本發(fā)明中,對(duì)目標(biāo)代碼的一次靜態(tài)掃描結(jié)果中的第一報(bào)錯(cuò),生成該第一報(bào)錯(cuò)的散列值(即第一散列值),這樣,可以根據(jù)該散列值從歷史報(bào)錯(cuò)記錄中查找是否存在與該散列值指示同一個(gè)報(bào)錯(cuò)的散列值(即第二散列值),若存在,則表示目標(biāo)代碼的歷史靜態(tài)掃描結(jié)果中曾出現(xiàn)該報(bào)錯(cuò),那么將第一散列值的報(bào)錯(cuò)ID取值為歷史報(bào)錯(cuò)記錄中所存儲(chǔ)的第二散列值的報(bào)錯(cuò)ID,由于報(bào)錯(cuò)ID用于唯一標(biāo)識(shí)一個(gè)報(bào)錯(cuò)的散列值,這樣,可以根據(jù)目標(biāo)代碼的不同次靜態(tài)掃描結(jié)果中各報(bào)錯(cuò)的報(bào)錯(cuò)ID來(lái)判斷該目標(biāo)代碼在各次靜態(tài)掃描中的新增掃描報(bào)錯(cuò)和已修復(fù)的掃描報(bào)錯(cuò),有效地形成目標(biāo)代碼的報(bào)錯(cuò)跟蹤的閉環(huán)管理。

附圖說(shuō)明

圖1為本發(fā)明的靜態(tài)代碼掃描結(jié)果處理方法的一個(gè)實(shí)施例的流程示意圖;

圖2對(duì)本發(fā)明中生成第一散列值的方法的一個(gè)實(shí)施例的流程示意圖;

圖3為采用本發(fā)明的靜態(tài)代碼掃描結(jié)果處理方法的一個(gè)裝置的結(jié)構(gòu)示意圖;

圖4為本發(fā)明的靜態(tài)代碼掃描結(jié)果處理裝置的一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;

圖5為本發(fā)明的靜態(tài)代碼掃描結(jié)果處理裝置的另一個(gè)實(shí)施例的結(jié)構(gòu)示意圖;

圖6是本發(fā)明實(shí)施例提供的一種服務(wù)器結(jié)構(gòu)示意圖。

具體實(shí)施方式

請(qǐng)參閱圖1,圖1為本發(fā)明的靜態(tài)代碼掃描結(jié)果處理方法的一個(gè)實(shí)施例的流程示意圖。如圖1所示,本實(shí)施例中的靜態(tài)代碼掃描結(jié)果處理方法包括:

101、獲取第一報(bào)錯(cuò),所述第一報(bào)錯(cuò)為對(duì)目標(biāo)代碼的一次靜態(tài)掃描結(jié)果中的一個(gè)報(bào)錯(cuò)。

本實(shí)施例中,目標(biāo)代碼是需要采用代碼掃描工具進(jìn)行安全性、規(guī)范性等檢查的項(xiàng)目代碼。具體的,可通過(guò)項(xiàng)目的SVN地址來(lái)獲取目標(biāo)代碼,并使用靜態(tài)代碼掃描工具來(lái)對(duì)該目標(biāo)代碼進(jìn)行掃描,其中,該靜態(tài)代碼掃描工具可以是TscanCode、Cppcheck、PC-Lint或者Cpplint,在此不作限制。對(duì)目標(biāo)代碼掃描后,掃描工具會(huì)輸出本次靜態(tài)掃描的掃描結(jié)果,其中,掃描結(jié)果中包括至少一個(gè)報(bào)錯(cuò)。其中,每個(gè)報(bào)錯(cuò)包括目標(biāo)代碼中一個(gè)錯(cuò)誤行代碼的信息。例如,報(bào)錯(cuò)包括報(bào)錯(cuò)位置、掃描規(guī)則和報(bào)錯(cuò)說(shuō)明,其中,報(bào)錯(cuò)位置包括錯(cuò)誤行代碼所在文件的文件名以及該錯(cuò)誤行代碼在該文件中的行號(hào),通過(guò)該文件名和行號(hào)可以具體定位錯(cuò)誤行代碼在目標(biāo)代碼中的位置。掃描規(guī)則用于指示錯(cuò)誤行代碼的錯(cuò)誤類型,例如,掃描規(guī)則可以指示錯(cuò)誤行代碼屬于數(shù)值計(jì)算的錯(cuò)誤,或者屬于數(shù)組越界錯(cuò)誤,或者屬于運(yùn)行邏輯錯(cuò)誤等等。報(bào)錯(cuò)說(shuō)明為對(duì)錯(cuò)誤行代碼的內(nèi)容的說(shuō)明,靜態(tài)代碼掃描工具輸出的報(bào)錯(cuò)說(shuō)明通常具有固定的模式。

本實(shí)施例中,第一報(bào)錯(cuò)指的是本次掃描結(jié)果中的一個(gè)報(bào)錯(cuò)。

102、根據(jù)所述第一報(bào)錯(cuò)生成第一散列值。

本實(shí)施例中,第一散列值用于指示第一報(bào)錯(cuò)的內(nèi)容。兩個(gè)相同的報(bào)錯(cuò)的散列值相同。生成第一散列值的方法有多種,下面結(jié)合圖2對(duì)其中的一種生成第一散列值的方法進(jìn)行舉例說(shuō)明。如圖2所示,本實(shí)施例中的生成第一散列值的方法,包括:

S1、獲取到第一報(bào)錯(cuò)后,根據(jù)第一報(bào)錯(cuò)中的報(bào)錯(cuò)位置獲取錯(cuò)誤行代碼以及錯(cuò)誤行代碼的位置內(nèi)容。

其中,該錯(cuò)誤行代碼的位置內(nèi)容用于指示該錯(cuò)誤行代碼的位置。實(shí)際應(yīng)用中,目標(biāo)代碼每一次經(jīng)靜態(tài)代碼掃描工具掃描后都有可能會(huì)進(jìn)行修改,得到不同版本的目標(biāo)代碼,因此同一行代碼在不同版本的目標(biāo)代碼中的行號(hào)不一定相同,本實(shí)施例中,根據(jù)錯(cuò)誤行代碼的位置獲取錯(cuò)誤行代碼的位置內(nèi)容,該位置內(nèi)容在不同版本的目標(biāo)代碼中保持不變。

其中,根據(jù)報(bào)錯(cuò)位置獲取錯(cuò)誤行代碼的位置內(nèi)容的方法可以有多種,例如,獲取到報(bào)錯(cuò)位置后,根據(jù)該報(bào)錯(cuò)位置查找錯(cuò)誤行代碼的所在函數(shù)。當(dāng)查找到所述錯(cuò)誤行代碼的所在函數(shù)時(shí),表示該錯(cuò)誤行代碼是位于一個(gè)函數(shù)作用域內(nèi),那么獲取所述函數(shù)的函數(shù)簽名,所述函數(shù)簽名包括所述函數(shù)的返回值類型、函數(shù)名和函數(shù)參數(shù)類型,將該函數(shù)的函數(shù)簽名作為位置內(nèi)容的至少部分。當(dāng)查找不到所述錯(cuò)誤行代碼的所在函數(shù)時(shí),表示該錯(cuò)誤行代碼不位于一個(gè)函數(shù)的作用域內(nèi),那么獲取所述錯(cuò)誤行代碼的上下文代碼,將所述上下文代碼作為該錯(cuò)誤行代碼的位置內(nèi)容的至少部分。

其中,錯(cuò)誤行代碼的上下文代碼指的是目標(biāo)代碼中位于所述錯(cuò)誤行代碼之前或者之后去除空行的N行代碼,N為正整數(shù),例如,N為10或者15;或者,錯(cuò)誤行代碼的上下文代碼指的是目標(biāo)代碼中位于所述錯(cuò)誤行代碼前后去除空行的M行代碼,例如,M為5。

其中,查找錯(cuò)誤行代碼的所在函數(shù)的方法有多種。例如,Cppcheck提供了c++代碼符號(hào)化功能,在Cppcheck符號(hào)化的基礎(chǔ)之上,可以輸出一個(gè)函數(shù)列表,該函數(shù)列表中包括源代碼文件中所有的函數(shù)以及這些函數(shù)的起始代碼行。在獲取到報(bào)錯(cuò)位置后,可根據(jù)報(bào)錯(cuò)位置中在該函數(shù)列表中查詢到錯(cuò)誤行代碼的所在函數(shù)?;蛘?,能夠提供相同的查找函數(shù)簽名的功能的工具還有clang。

具體舉例來(lái)說(shuō),Cppcheck包含一個(gè)叫做SymbolDatabase的類,提供了訪問(wèn)函數(shù)以及函數(shù)范圍信息的功能。例如對(duì)于token.cpp這個(gè)文件中的代碼片段,SymbolDatabase提供了函數(shù)Token::firstWordEquals的作用域范圍為547行到560行,如果報(bào)錯(cuò)位置中錯(cuò)誤行代碼的行號(hào)為555,那么可以確定該錯(cuò)誤行代碼位于函數(shù)Token::firstWordEquals,從而得到其函數(shù)簽名為bool Token::firstWordEquals(const char*,const char*)。

S2、去除所述錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和所述位置內(nèi)容中的干擾信息。

本實(shí)施例中,第一散列值是用于和其他報(bào)錯(cuò)的散列值進(jìn)行比較,以判斷第一散列值和其他報(bào)錯(cuò)是否為同一個(gè)報(bào)錯(cuò),而錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和所述位置內(nèi)容這些信息是用于生成第一散列值的,因此,需要將錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和所述位置內(nèi)容這些信息中容易在不同版本的目標(biāo)代碼中出現(xiàn)變動(dòng)的信息以及對(duì)進(jìn)行比較無(wú)用的信息去除掉。例如,將錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和所述位置內(nèi)容中的注釋、多余的空格和制表符去除,將報(bào)錯(cuò)說(shuō)明中可能存在的和行號(hào)相關(guān)的信息去除等等。具體的,可通過(guò)分別對(duì)所述錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和所述位置內(nèi)容進(jìn)行符號(hào)化來(lái)去除干擾信息。

具體舉例來(lái)說(shuō),一個(gè)報(bào)錯(cuò)的報(bào)錯(cuò)說(shuō)明為:[npSt]is dereferenced in Function[DereferenceFunction]at line 65 before check null here。在該報(bào)錯(cuò)說(shuō)明中,“at line65”中的65是錯(cuò)誤行代碼的行號(hào),如果錯(cuò)誤行代碼的位置發(fā)生變化,這個(gè)行號(hào)也會(huì)發(fā)生變化,因此,作為判定報(bào)錯(cuò)相同的依據(jù)時(shí),需去掉該數(shù)字。此外,對(duì)于這種報(bào)錯(cuò)類型而言,報(bào)錯(cuò)信息中最關(guān)鍵的是和變量相關(guān)的信息,也即“[npSt]is dereferenced”中的變量名npSt,因此只保留報(bào)錯(cuò)說(shuō)明中的變量名npSt作為判定依據(jù)已經(jīng)足夠。

本實(shí)施例中,當(dāng)位置內(nèi)容具體為錯(cuò)誤行代碼所在函數(shù)的函數(shù)簽名時(shí),可選的,還去除函數(shù)簽名中的參數(shù)名,僅保留函數(shù)簽名中的函數(shù)的返回值類型、函數(shù)名和函數(shù)參數(shù)類型,由于該三個(gè)信息足夠用于判斷兩個(gè)函數(shù)是否為同一個(gè)函數(shù),僅保留該三個(gè)信息能夠去除參數(shù)名改變?cè)斐傻牟焕绊?,也可以減少用于判定的字符串長(zhǎng)度。

S3、根據(jù)所述文件名、掃描規(guī)則以及去除干擾信息后的錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和函數(shù)簽名生成所述第一散列值。

根據(jù)文件名、掃描規(guī)則、錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和函數(shù)簽名生成散列值的方法有多種。例如,分別計(jì)算去除干擾信息后的錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和位置內(nèi)容的MD5值;將所述文件名、掃描規(guī)則、所述錯(cuò)誤行代碼的MD(英文全稱:Message Digest Algorithm,中文全稱:消息摘要算法)5值、所述報(bào)錯(cuò)說(shuō)明的MD5值和所述位置內(nèi)容的MD5值連接,形成所述第一散列值。該MD5值的作用是讓大容量信息被壓縮成一種簡(jiǎn)短的字符串信息,形成該大容量信息獨(dú)一無(wú)二的“數(shù)字指紋”?;蛘?,上述的MD5值也可以替換為MD2值或者M(jìn)D4值,在此不作限制。

本實(shí)施例中,通過(guò)文件名、掃描規(guī)則、錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和函數(shù)簽名來(lái)生成第一報(bào)錯(cuò)的第一散列值,由于該五個(gè)信息的組合能夠唯一指向第一報(bào)錯(cuò)中的錯(cuò)誤行代碼,那么當(dāng)兩個(gè)根據(jù)該五個(gè)信息所形成的散列值相同時(shí),即可確認(rèn)該兩個(gè)散列值所關(guān)聯(lián)的報(bào)錯(cuò)為同一個(gè)報(bào)錯(cuò),而且,該五個(gè)信息的內(nèi)容較少,有助于散列值的簡(jiǎn)短化。

103、根據(jù)所述第一散列值在歷史報(bào)錯(cuò)記錄表中查找第二散列值,所述第二散列值為與所述第一散列值指示同一個(gè)報(bào)錯(cuò)的散列值。

本實(shí)施例中,歷史報(bào)錯(cuò)記錄表中存有所述目標(biāo)代碼的歷史靜態(tài)掃描結(jié)果中各報(bào)錯(cuò)的散列值以及報(bào)錯(cuò)ID,其中,所述報(bào)錯(cuò)的報(bào)錯(cuò)ID用于唯一標(biāo)識(shí)所述報(bào)錯(cuò)的散列值。具體的,該歷史報(bào)錯(cuò)記錄表為哈希表。

本實(shí)施例中,查找第二散列值的方法有多種。下面對(duì)在采用圖2所示實(shí)施例中的方法來(lái)生成散列值的情況下查找第二散列值的一種方法進(jìn)行舉例說(shuō)明。

遍歷歷史報(bào)錯(cuò)記錄表,當(dāng)查找到和第一散列值相同的散列值(為描述方便,下文稱為目標(biāo)散列值)時(shí),根據(jù)該目標(biāo)散列值獲取對(duì)應(yīng)的報(bào)錯(cuò)中的錯(cuò)誤行代碼的位置內(nèi)容,當(dāng)所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容相同時(shí),確定所述目標(biāo)函數(shù)簽名為所述第二散列值。

本實(shí)施例中,獲取目標(biāo)散列值對(duì)應(yīng)的位置內(nèi)容和第一散列值對(duì)應(yīng)的位置內(nèi)容的方法有多種。例如,對(duì)目標(biāo)代碼每次靜態(tài)掃描的掃描結(jié)果,在生成該掃描結(jié)果中各報(bào)錯(cuò)的散列值后,還將該散列值以及該散列值對(duì)應(yīng)的位置內(nèi)容存儲(chǔ)到存儲(chǔ)器中。這樣,在確定目標(biāo)散列值和第一散列值后,可直接從存儲(chǔ)器中查找該兩個(gè)散列值分別對(duì)應(yīng)的位置內(nèi)容。

本實(shí)施例中,當(dāng)目標(biāo)散列值對(duì)應(yīng)的報(bào)錯(cuò)的位置內(nèi)容和第一散列值對(duì)應(yīng)的報(bào)錯(cuò)的位置內(nèi)容為相同的函數(shù)簽名時(shí),可確定該兩個(gè)位置內(nèi)容相同;當(dāng)目標(biāo)散列值對(duì)應(yīng)的報(bào)錯(cuò)的位置內(nèi)容和第一散列值對(duì)應(yīng)的報(bào)錯(cuò)的位置內(nèi)容均為相同的上下文代碼時(shí),確定該兩個(gè)位置內(nèi)容相同。

實(shí)際應(yīng)用中,不同版本的目標(biāo)代碼中同一段代碼可能會(huì)出現(xiàn)細(xì)微的差別,因此,優(yōu)選的,本實(shí)施例中,當(dāng)位置內(nèi)容為上下文代碼時(shí),還計(jì)算所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼的相似度,當(dāng)所述相似度大于第一閾值(例如為85%)時(shí),確定所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容相同;或者,還計(jì)算所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼的編輯距離,當(dāng)所述編輯距離大于第二閾值時(shí),確定所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容相同。

其中,計(jì)算兩段代碼的相似度的方法具體如下:執(zhí)行步驟A:從該兩段代碼中提取出相同程度最大的一段字符,這樣,每段代碼還剩位于該段字符前面的一段字符(為描述方便,下文簡(jiǎn)稱為前段字符)和后面的一段字符(為描述方便,下午簡(jiǎn)稱為后段字符)。對(duì)該兩段代碼的前段字符重復(fù)執(zhí)行步驟A,提取出該兩個(gè)前段字符中的相同程度最大的一段字符,這樣,該兩個(gè)前段字符被該段字符進(jìn)一步分為前段字符和后段字符,對(duì)該兩個(gè)前端字符重復(fù)執(zhí)行步驟A,以此類推,直至兩段字符中不在包含相同的部分。對(duì)該兩段代碼的后段字符的操作和對(duì)該兩段代碼的前段字符的操作相同。統(tǒng)計(jì)從該兩段代碼中提取出的所有相同字符的長(zhǎng)度的和,那么該兩段代碼的相似度等于該所有相同字符的長(zhǎng)度的和與2的乘積除以該兩段代碼的長(zhǎng)度之和。

其中,計(jì)算兩段代碼的編輯距離的方法為現(xiàn)有技術(shù),在此不再贅述。

104、當(dāng)查找到所述第二散列值時(shí),將所述第一散列值的報(bào)錯(cuò)ID取值為所述第二散列值的報(bào)錯(cuò)ID。

當(dāng)在在歷史報(bào)錯(cuò)記錄表中查找第二散列值時(shí),即可確定對(duì)目標(biāo)代碼的歷史掃描中曾經(jīng)出現(xiàn)過(guò)第一報(bào)錯(cuò),因此將第一散列值的報(bào)錯(cuò)ID取值為歷史報(bào)錯(cuò)記錄表中所存儲(chǔ)的第二散列值對(duì)應(yīng)的報(bào)錯(cuò)ID,以表示該第一散列值和第二散列值對(duì)應(yīng)的報(bào)錯(cuò)為同一個(gè)報(bào)錯(cuò)。

若查找不到第二散列值,則可確定對(duì)目標(biāo)代碼的歷史掃描中未曾出現(xiàn)過(guò)第一報(bào)錯(cuò),那么該第一報(bào)錯(cuò)為新增的報(bào)錯(cuò),則另外為該第一報(bào)錯(cuò)分配新的報(bào)錯(cuò)ID。

本實(shí)施例中,對(duì)目標(biāo)代碼的一次靜態(tài)掃描結(jié)果中的第一報(bào)錯(cuò),生成第一散列值),這樣,可以根據(jù)該散列值從歷史報(bào)錯(cuò)記錄中查找是否存在與該散列值指示同一個(gè)報(bào)錯(cuò)的散列值(即第二散列值),若存在,則將第一散列值的報(bào)錯(cuò)ID取值為歷史報(bào)錯(cuò)記錄中所存儲(chǔ)的第二散列值的報(bào)錯(cuò)ID,由于報(bào)錯(cuò)ID用于唯一標(biāo)識(shí)一個(gè)報(bào)錯(cuò)的散列值,這樣,可以根據(jù)目標(biāo)代碼的不同次靜態(tài)掃描結(jié)果中各報(bào)錯(cuò)的報(bào)錯(cuò)ID來(lái)判斷該目標(biāo)代碼在各次靜態(tài)掃描中的新增掃描報(bào)錯(cuò)和已修復(fù)的掃描報(bào)錯(cuò),能夠?qū)崿F(xiàn)目標(biāo)代碼的報(bào)錯(cuò)跟蹤的閉環(huán)管理。

為理解本發(fā)明,下面結(jié)合一個(gè)實(shí)際應(yīng)用場(chǎng)景對(duì)本發(fā)明的靜態(tài)代碼掃描結(jié)果處理方法進(jìn)行舉例說(shuō)明。

如圖3所示,圖3為采用本發(fā)明的靜態(tài)代碼掃描結(jié)果處理方法的一個(gè)裝置的結(jié)構(gòu)示意圖。該裝置具體為X86架構(gòu)處理器,具體的,該X86架構(gòu)處理器包括靜態(tài)代碼掃描服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和網(wǎng)頁(yè)(Web)服務(wù)器。其中,靜態(tài)代碼掃描服務(wù)器上運(yùn)行有l(wèi)inux操作系統(tǒng)。

在靜態(tài)代碼掃描服務(wù)器中,通過(guò)項(xiàng)目的SVN地址獲取到該項(xiàng)目的項(xiàng)目代碼,使用靜態(tài)代碼掃描服務(wù)器中的靜態(tài)代碼掃描工具(本實(shí)施例中具體為Cppcheck)來(lái)對(duì)該項(xiàng)目代碼進(jìn)行第一次掃描。掃描結(jié)束后,Cppcheck輸出掃描結(jié)果,將該掃描結(jié)果存儲(chǔ)到數(shù)據(jù)庫(kù)服務(wù)器中。具體的,該掃描結(jié)果可以以可擴(kuò)展標(biāo)記語(yǔ)言的格式文件呈現(xiàn)。該掃描結(jié)果中包括報(bào)錯(cuò)列表,其中,該報(bào)錯(cuò)列表中的每一個(gè)報(bào)錯(cuò)包括報(bào)錯(cuò)位置、掃描規(guī)則和報(bào)錯(cuò)說(shuō)明,其中,報(bào)錯(cuò)位置包括錯(cuò)誤行代碼所在文件的文件名以及該錯(cuò)誤行代碼在該文件中的行號(hào)。例如,一個(gè)報(bào)錯(cuò)具體為:<error file=“CS_BadRecursive.cs”line=“48”rule=“BadRecursive.cs”msg=“[c1]may lead to dead loop”/。

對(duì)報(bào)錯(cuò)列表中的每一個(gè)報(bào)錯(cuò),生成該報(bào)錯(cuò)的散列值。獲取到報(bào)錯(cuò)列表中的各報(bào)錯(cuò)的散列值后,建立第一哈希表和總哈希表并存儲(chǔ)到數(shù)據(jù)庫(kù)服務(wù)器中。其中,在第一哈希表和總哈希表中均存儲(chǔ)各散列值,并為每一個(gè)散列值分配一個(gè)與該散列值唯一對(duì)應(yīng)的報(bào)錯(cuò)ID。另外,還在該第一哈希表和總哈希表中存儲(chǔ)各散列值對(duì)應(yīng)的位置內(nèi)容。

在對(duì)項(xiàng)目代碼第一次掃描后,根據(jù)報(bào)錯(cuò)列表對(duì)項(xiàng)目代碼進(jìn)行修改,形成第二個(gè)版本的項(xiàng)目代碼,為該版本的項(xiàng)目代碼分配程序版本號(hào)。靜態(tài)代碼掃描工具對(duì)第二個(gè)版本的項(xiàng)目代碼進(jìn)行掃描后,輸出掃描結(jié)果,該掃描結(jié)果中包括報(bào)錯(cuò)列表。對(duì)報(bào)錯(cuò)列表中的每一個(gè)報(bào)錯(cuò),生成該報(bào)錯(cuò)的散列值。為該第二個(gè)版本的項(xiàng)目代碼的掃描結(jié)果建立第二哈希表,用于存儲(chǔ)該掃描結(jié)果中的報(bào)錯(cuò)列表中各報(bào)錯(cuò)的散列值。將掃描結(jié)果以及第二哈希表存儲(chǔ)到數(shù)據(jù)庫(kù)服務(wù)器中。

其中,對(duì)第二哈希表中的每一個(gè)散列值M,從總哈希表中查找與該散列值M相同的散列值N,當(dāng)查找到散列值N時(shí),判斷總哈希表中散列值N對(duì)應(yīng)的位置內(nèi)容和第二哈希表中散列值M對(duì)應(yīng)的位置內(nèi)容是否相同。若相同,那么將總哈希表中散列值N對(duì)應(yīng)的報(bào)錯(cuò)ID作為散列值M的報(bào)錯(cuò)ID存儲(chǔ)到的第二哈希表中;若不相同,或者查找不到散列值N時(shí),在第二哈希表中為散列值M分配一個(gè)新的報(bào)錯(cuò)ID,并將該新增的報(bào)錯(cuò)ID、散列值M以及該散列值M對(duì)應(yīng)的位置內(nèi)容存儲(chǔ)到總哈希表中。

以此類推,在對(duì)每個(gè)版本的項(xiàng)目代碼的掃描結(jié)果均采用上述的處理方法。這樣,可以獲取到每個(gè)版本的項(xiàng)目代碼的掃描結(jié)果,而且各掃描結(jié)果中相同的報(bào)錯(cuò)的報(bào)錯(cuò)ID相同。

將各版本的項(xiàng)目代碼的掃描結(jié)果通過(guò)Web服務(wù)器向用戶展示。

可選的,在Web服務(wù)器中預(yù)置有至少兩個(gè)級(jí)別的緊急程度以及每一個(gè)級(jí)別的緊急程度的判斷條件。在接收到各版本的項(xiàng)目代碼的掃描結(jié)果后,對(duì)每一個(gè)掃描結(jié)果中的每一個(gè)報(bào)錯(cuò),根據(jù)該報(bào)錯(cuò)的報(bào)錯(cuò)說(shuō)明所滿足的判斷條件確定該報(bào)錯(cuò)對(duì)應(yīng)的緊急程度的級(jí)別??蛇x的,還對(duì)每個(gè)版本中每一個(gè)級(jí)別對(duì)應(yīng)的緊急程度的報(bào)錯(cuò)進(jìn)行統(tǒng)計(jì)和顯示。

例如,預(yù)置規(guī)則中將報(bào)錯(cuò)的緊急程度分為致命、嚴(yán)重、一般和提醒四個(gè)級(jí)別。Web服務(wù)器接收到一個(gè)版本的項(xiàng)目代碼的掃描結(jié)果時(shí),統(tǒng)計(jì)出該掃描結(jié)果中包括154個(gè)報(bào)錯(cuò),并根據(jù)預(yù)置規(guī)則確定該掃描結(jié)果中致命級(jí)別對(duì)應(yīng)的報(bào)錯(cuò)數(shù)量為24個(gè),嚴(yán)重級(jí)別對(duì)應(yīng)的報(bào)錯(cuò)數(shù)量為30個(gè),一般級(jí)別對(duì)應(yīng)的報(bào)錯(cuò)數(shù)量為95個(gè),提醒級(jí)別對(duì)應(yīng)的報(bào)錯(cuò)數(shù)量為5個(gè)。在對(duì)該掃描結(jié)果進(jìn)行展示時(shí),具體對(duì)該掃描結(jié)果中的總數(shù)以及每個(gè)級(jí)別對(duì)應(yīng)的報(bào)錯(cuò)數(shù)量進(jìn)行展示。

可選的,在Web服務(wù)器中,在每個(gè)版本的項(xiàng)目代碼的哈希表中還對(duì)新增的報(bào)錯(cuò)ID以及對(duì)應(yīng)的散列值采用第一方式進(jìn)行標(biāo)記和統(tǒng)計(jì),在對(duì)該掃描結(jié)果進(jìn)行展示時(shí),還對(duì)該掃描結(jié)果中新增的報(bào)錯(cuò)的數(shù)量進(jìn)行展示??蛇x的,在接收到用戶查看新增報(bào)錯(cuò)的指令時(shí),對(duì)該掃描結(jié)果中新增的報(bào)錯(cuò)的具體詳情進(jìn)行展示,以方便用戶快速查看到每個(gè)版本的項(xiàng)目代碼中的新增報(bào)錯(cuò)。

可選的,在Web服務(wù)器中,還將每個(gè)版本的項(xiàng)目代碼的哈希表與后一個(gè)版本的項(xiàng)目代碼的哈希表進(jìn)行比較,若某個(gè)報(bào)錯(cuò)ID在該版本的哈希表中出現(xiàn)且在后一個(gè)版本的哈希表中沒(méi)有出現(xiàn),則可確定該報(bào)錯(cuò)ID對(duì)應(yīng)的報(bào)錯(cuò)為已修復(fù)的報(bào)錯(cuò),并對(duì)該報(bào)錯(cuò)ID以及對(duì)應(yīng)的散列值采用第二方式進(jìn)行標(biāo)記和統(tǒng)計(jì),以方便用戶快速查看到每個(gè)版本的項(xiàng)目代碼中的已修復(fù)報(bào)錯(cuò)。

例如,在第一個(gè)版本的項(xiàng)目代碼的哈希表中包括兩個(gè)報(bào)錯(cuò)ID:

00000241-AD4E-BCE5-FFCE-F5CC0759362

000002D7-14C5-B4AD-C685-F4830417CB76

在第二個(gè)版本的項(xiàng)目代碼的哈希表中包括兩個(gè)報(bào)錯(cuò)ID:

000002D7-14C5-B4AD-C685-F4830417CB76

000003C3-DBCB-C8AF-1214-392C0E08B504

那么,可以確定第一個(gè)版本的項(xiàng)目代碼的哈希表中報(bào)錯(cuò)00000241-AD4E-BCE5-FFCE-F5CC0759362C在第二個(gè)版本中被修復(fù),在第二個(gè)版本中,報(bào)錯(cuò)000003C3-DBCB-C8AF-1214-392C0E08B504為新增的報(bào)錯(cuò),而報(bào)錯(cuò)000002D7-14C5-B4AD-C685-F4830417CB76在第二個(gè)版本中繼續(xù)存在,沒(méi)有被修復(fù)。

可選的,在Web服務(wù)器中,在獲取到項(xiàng)目代碼至少兩個(gè)版本的掃描結(jié)果后,還可以采用圖表展示該項(xiàng)目代碼在各版本中新增的報(bào)錯(cuò)數(shù)量和已修復(fù)的報(bào)錯(cuò)數(shù)量,以更加直觀地展示項(xiàng)目的質(zhì)量變更趨勢(shì)。

上面對(duì)本發(fā)明的靜態(tài)代碼掃描結(jié)果處理方法進(jìn)行了描述,下面將對(duì)本發(fā)明的靜態(tài)代碼掃描結(jié)果處理裝置進(jìn)行描述。

請(qǐng)參閱圖4,圖4為本發(fā)明的靜態(tài)代碼掃描結(jié)果處理裝置的一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。本實(shí)施例中,靜態(tài)代碼掃描結(jié)果處理裝置400包括:

獲取模塊401,用于獲取第一報(bào)錯(cuò),所述第一報(bào)錯(cuò)為對(duì)目標(biāo)代碼的一次靜態(tài)掃描結(jié)果中的一個(gè)報(bào)錯(cuò);

生成模塊402,用于根據(jù)所述第一報(bào)錯(cuò)生成第一散列值;

查找模塊403,用于根據(jù)所述第一散列值在歷史報(bào)錯(cuò)記錄表中查找第二散列值,所述第二散列值為與所述第一散列值指示同一個(gè)報(bào)錯(cuò)的散列值,其中,所述歷史報(bào)錯(cuò)記錄表中存有所述目標(biāo)代碼的歷史靜態(tài)掃描結(jié)果中各報(bào)錯(cuò)的散列值以及報(bào)錯(cuò)ID,其中,所述報(bào)錯(cuò)的報(bào)錯(cuò)ID用于唯一標(biāo)識(shí)所述報(bào)錯(cuò)的散列值;

取值模塊404,用于當(dāng)查找到所述第二散列值時(shí),將所述第一散列值的報(bào)錯(cuò)ID取值為所述第二散列值的報(bào)錯(cuò)ID。

本實(shí)施例中,對(duì)目標(biāo)代碼的一次靜態(tài)掃描結(jié)果中的第一報(bào)錯(cuò),生成第一散列值),這樣,可以根據(jù)該散列值從歷史報(bào)錯(cuò)記錄中查找是否存在與該散列值指示同一個(gè)報(bào)錯(cuò)的散列值(即第二散列值),若存在,則將第一散列值的報(bào)錯(cuò)ID取值為歷史報(bào)錯(cuò)記錄中所存儲(chǔ)的第二散列值的報(bào)錯(cuò)ID,由于報(bào)錯(cuò)ID用于唯一標(biāo)識(shí)一個(gè)報(bào)錯(cuò)的散列值,這樣,可以根據(jù)目標(biāo)代碼的不同次靜態(tài)掃描結(jié)果中各報(bào)錯(cuò)的報(bào)錯(cuò)ID來(lái)判斷該目標(biāo)代碼在各次靜態(tài)掃描中的新增掃描報(bào)錯(cuò)和已修復(fù)的掃描報(bào)錯(cuò),能夠?qū)崿F(xiàn)目標(biāo)代碼的報(bào)錯(cuò)跟蹤的閉環(huán)管理。

可選的,所述第一報(bào)錯(cuò)包括報(bào)錯(cuò)位置、掃描規(guī)則和報(bào)錯(cuò)說(shuō)明,所述報(bào)錯(cuò)位置包括錯(cuò)誤行代碼所在文件的文件名以及所述錯(cuò)誤行代碼在所述文件中的行號(hào);

所述生成模塊402具體用于:

根據(jù)所述報(bào)錯(cuò)位置獲取錯(cuò)誤行代碼以及所述錯(cuò)誤行代碼的位置內(nèi)容,其中,所述錯(cuò)誤行代碼的位置內(nèi)容在所述目標(biāo)代碼中保持不變;

去除所述錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和所述位置內(nèi)容中的干擾信息;

根據(jù)所述文件名、掃描規(guī)則以及去除干擾信息后的錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和函數(shù)簽名生成所述第一散列值。

進(jìn)一步,可選的,所述生成模塊402在根據(jù)所述報(bào)錯(cuò)位置獲取所述報(bào)錯(cuò)的位置內(nèi)容是,具體用于:

根據(jù)所述報(bào)錯(cuò)位置查找所述錯(cuò)誤行代碼的所在函數(shù);

當(dāng)查找到所述錯(cuò)誤行代碼的所在函數(shù)時(shí),獲取所述函數(shù)的函數(shù)簽名,所述位置內(nèi)容包括所述函數(shù)簽名,所述函數(shù)簽名包括所述函數(shù)的返回值類型、函數(shù)名和函數(shù)參數(shù)類型;

當(dāng)查找不到所述錯(cuò)誤行代碼的所在函數(shù)時(shí),獲取所述錯(cuò)誤行代碼的上下文代碼,所述位置內(nèi)容包括所述上下文代碼。

進(jìn)一步,可選的,所述生成模塊402在根據(jù)所述文件名、掃描規(guī)則以及去除干擾信息后的錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和位置內(nèi)容生成所述第一字符時(shí),具體用于:

分別計(jì)算去除干擾信息后的錯(cuò)誤行代碼、報(bào)錯(cuò)說(shuō)明和位置內(nèi)容的MD5值;

將所述文件名、掃描規(guī)則、所述錯(cuò)誤行代碼的MD5值、所述報(bào)錯(cuò)說(shuō)明的MD5值和所述位置內(nèi)容的MD5值連接,形成所述第一散列值。

可選的,所述查找模塊403具體用于:

在所述歷史報(bào)錯(cuò)記錄表中查找目標(biāo)散列值,所述目標(biāo)散列值為與所述第一散列值相同的散列值;

當(dāng)查找到所述目標(biāo)散列值時(shí),獲取所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容;

當(dāng)所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容相同時(shí),確定所述目標(biāo)函數(shù)簽名為所述第二散列值。

如圖5所示,圖5為本發(fā)明的靜態(tài)代碼掃描結(jié)果處理裝置的一個(gè)實(shí)施例的結(jié)構(gòu)示意圖。與圖4所示實(shí)施例不同的是,本實(shí)施例中,所述目標(biāo)散列值的位置內(nèi)容和所述第一散列值的位置內(nèi)容均為上下文代碼;所述裝置500還包括:

計(jì)算模塊501,用于執(zhí)行以下步驟:

計(jì)算所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼的相似度,當(dāng)所述相似度大于第一閾值時(shí),確定所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容相同;

或者,

計(jì)算所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的上下文代碼的編輯距離,當(dāng)所述編輯距離大于第二閾值時(shí),確定所述目標(biāo)散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容和所述第一散列值對(duì)應(yīng)的錯(cuò)誤行代碼的位置內(nèi)容相同。

請(qǐng)參閱圖6,圖6是本發(fā)明實(shí)施例提供的一種服務(wù)器結(jié)構(gòu)示意圖,該服務(wù)器1100可因配置或性能不同而產(chǎn)生比較大的差異,可以包括一個(gè)或一個(gè)以上中央處理器(central processing units,CPU)1122(例如,一個(gè)或一個(gè)以上處理器)和存儲(chǔ)器1132,一個(gè)或一個(gè)以上存儲(chǔ)應(yīng)用程序1142或數(shù)據(jù)1144的存儲(chǔ)介質(zhì)1130(例如一個(gè)或一個(gè)以上海量存儲(chǔ)設(shè)備)。其中,存儲(chǔ)器1132和存儲(chǔ)介質(zhì)1130可以是短暫存儲(chǔ)或持久存儲(chǔ)。存儲(chǔ)在存儲(chǔ)介質(zhì)1130的程序可以包括一個(gè)或一個(gè)以上模塊(圖示沒(méi)標(biāo)出),每個(gè)模塊可以包括對(duì)服務(wù)器中的一系列指令操作。更進(jìn)一步地,中央處理器1122可以設(shè)置為與存儲(chǔ)介質(zhì)1130通信,在服務(wù)器1100上執(zhí)行存儲(chǔ)介質(zhì)1130中的一系列指令操作。

服務(wù)器1100還可以包括一個(gè)或一個(gè)以上電源1126,一個(gè)或一個(gè)以上有線或無(wú)線網(wǎng)絡(luò)接口1150,一個(gè)或一個(gè)以上輸入輸出接口1158,和/或,一個(gè)或一個(gè)以上操作系統(tǒng)1141,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,F(xiàn)reeBSDTM等等。

上述用于執(zhí)行圖1至圖3所示實(shí)施例中的方法步驟的裝置可以基于該圖6所示的服務(wù)器結(jié)構(gòu)。

所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡(jiǎn)潔,上述描述的系統(tǒng),裝置和單元的具體工作過(guò)程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過(guò)程,在此不再贅述。

在本申請(qǐng)所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的系統(tǒng),裝置和方法,可以通過(guò)其它的方式實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過(guò)一些接口,裝置或單元的間接耦合或通信連接,可以是電性,機(jī)械或其它的形式。

所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。可以根據(jù)實(shí)際的需要選擇其中的部分或者全部單元來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。

另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。

所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說(shuō)對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。

以上所述,以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的精神和范圍。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1