一種空指針崩潰的挖掘方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別涉及一種空指針崩潰的挖掘方法,及裝置。
【背景技術(shù)】
[0002] 空指針崩潰是指軟件程序中如果直接使用空指針變量的一個屬性方法則會引起 軟件崩潰(Crash)??罩羔樖侵羔樀囊环N,指針是指值為內(nèi)存地址的一種變量,空指針則是 內(nèi)存地址為空(NULL)的指針變量。
[0003] 空指針崩潰代碼,是指使用空指針變量的代碼行。因此,空指針崩潰代碼存在引起 軟件崩潰的風(fēng)險,為了避免這種風(fēng)險,通常需要通過判空保護來避免軟件崩潰。判空保護的 過程是:判斷指針變量的值是否等于NULL,如果指針變量值等于NULL時,就不使用該指針 變量,如果不等于NULL則可以使用該指針變量。
[0004] 空指針崩潰挖掘是在代碼中找出會導(dǎo)致軟件崩潰的空指針的過程,目前有實現(xiàn)該 功能的工具軟件,如CPPcheck工具,其挖掘方法如下:遇到函數(shù)會返回指針變量的代碼行, 則判斷該代碼行是否有判空保護,如果沒有判空保護,則給該代碼行報空指針崩潰代碼告 警。
[0005] 由于CPPcheck工具遇到函數(shù)會返回指針變量的代碼行且沒有判空保護的代碼, 就直接給該代碼行報空指針崩潰代碼告警。但是,如果函數(shù)返回值中沒有返回NULL的代碼 實現(xiàn),即使函數(shù)的使用者沒有判空保護的代碼,也不會產(chǎn)生指針變量為NULL的可能。因此, 會導(dǎo)致大量的無效告警。目前,一些產(chǎn)品在使用CPPcheck工具進行空指針崩潰風(fēng)險挖掘時 常會爆出幾百,幾千甚至上萬的告警,由于其誤報的存在,導(dǎo)致人工無法對大量的告警進行 分析。因此,采用CPPcheck工具進行空指針崩潰挖掘,誤報率高。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明實施例提供了一種空指針崩潰的挖掘方法,及裝置,用于準確找出會導(dǎo)致 軟件崩潰的空指針。
[0007] -種空指針崩潰的挖掘方法,包括:
[0008] 獲取全量代碼文件內(nèi)返回空指針的函數(shù);
[0009] 獲取待挖掘的代碼中使用了所述空指針的變量作為危險變量;
[0010] 使用所述危險變量進行前向搜索,若搜索得到使用了所述危險變量的代碼行,并 且所述代碼行未進行判空保護,則確定所述代碼行為產(chǎn)生空指針崩潰的代碼行。
[0011] -種空指針崩潰的挖掘裝置,包括:
[0012] 函數(shù)獲取單元,用于獲取全量代碼文件內(nèi)返回空指針的函數(shù);
[0013] 變量獲取單元,用于獲取待挖掘的代碼中使用了所述空指針的變量作為危險變 量;
[0014] 代碼搜索單元,用于使用所述危險變量進行前向搜索;
[0015] 危險確定單元,用于若搜索得到使用了所述危險變量的代碼行,并且所述代碼行 未進行判空保護,則確定所述代碼行為產(chǎn)生空指針崩潰的代碼行。
[0016] 從以上技術(shù)方案可以看出,本發(fā)明實施例具有以下優(yōu)點:首先確定返回空指針的 函數(shù),然后通過返回空指針函數(shù)被使用的情況確定危險變量,然后通過危險變量定位到產(chǎn) 生空指針崩潰的代碼行??梢詼蚀_找出會導(dǎo)致軟件崩潰的空指針。
【附圖說明】
[0017] 為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使 用的附圖作簡要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本 領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其 他的附圖。
[0018] 圖1為本發(fā)明實施例方法流程示意圖;
[0019] 圖2為本發(fā)明實施例裝置結(jié)構(gòu)示意圖;
[0020] 圖3為本發(fā)明實施例裝置結(jié)構(gòu)示意圖;
[0021] 圖4為本發(fā)明實施例裝置結(jié)構(gòu)示意圖;
[0022] 圖5為本發(fā)明實施例裝置結(jié)構(gòu)示意圖;
[0023] 圖6為本發(fā)明實施例服務(wù)器結(jié)構(gòu)示意圖。
【具體實施方式】
[0024] 為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明作進 一步地詳細描述,顯然,所描述的實施例僅僅是本發(fā)明一部份實施例,而不是全部的實施 例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的 所有其它實施例,都屬于本發(fā)明保護的范圍。
[0025] 本發(fā)明實施例提供了一種空指針崩潰的挖掘方法,如圖1所示,包括:
[0026] 101 :獲取全量代碼文件內(nèi)返回空指針的函數(shù);
[0027] 在本實施例中,全量代碼可以就是待挖掘的代碼,待挖掘的代碼也可以僅是全量 代碼的一部分代碼。全量代碼用于確定返回空指針的函數(shù),但是返回空指針的函數(shù)并不一 定會造成空指針崩潰,因此獲取全量代碼文件內(nèi)返回空指針的函數(shù)作為空指針崩潰的挖掘 前期準備。
[0028] 102 :獲取待挖掘的代碼中使用了上述空指針的變量作為危險變量;
[0029] 在本實施例中,找到危險變量是為了確定使用了空指針的變量,危險變量是可能 導(dǎo)致代碼出現(xiàn)空指針崩潰的變量,但是并不一定會產(chǎn)生空指針崩潰,因此本發(fā)明實施例還 需要進一步進行確認。
[0030] 103:使用上述危險變量進行前向搜索,若搜索得到使用了上述危險變量的代碼 行,并且上述代碼行未進行判空保護,則確定上述代碼行為產(chǎn)生空指針崩潰的代碼行。
[0031] 在本發(fā)明實施例中,前向搜索的代碼條數(shù)可以人為限定,也可以是對危險變量的 生命周期所在的代碼段進行前向搜索,前向搜索的條數(shù)本發(fā)明實施例不做唯一性限定。
[0032] 在本實施例中,首先確定返回空指針的函數(shù),然后通過返回空指針函數(shù)被使用的 情況確定危險變量,然后通過危險變量定位到產(chǎn)生空指針崩潰的代碼行。可以準確找出會 導(dǎo)致軟件崩潰的空指針。
[0033] 即使使用了空指針,也并不代表一定會產(chǎn)生空指針崩潰,因此也不能認為是危險 變量,因為有可能是并不會被執(zhí)行的代碼,例如:注釋型代碼。因此為了進一步提高挖掘空 指針崩潰的代碼的準確性,本實施例可以進一步地如下:在使用上述危險變量進行前向搜 索之前還包括:
[0034] 確定上述危險變量是否為注釋型代碼行,若不是,則使用上述危險變量進行前向 搜索。
[0035] 本發(fā)明實施例還給出了危險函數(shù)庫模型的創(chuàng)建方案,用來提高查找危險變量的準 確性,具體如下:上述獲取全量代碼文件內(nèi)返回空指針的函數(shù);包括:
[0036] 獲取全量代碼文件內(nèi)各函數(shù)中返回值類型為空的函數(shù)名;
[0037] 將構(gòu)造空指針的危險函數(shù)庫模型,上述危險函數(shù)庫模型的鍵值為:返回值類型為 空的函數(shù)名以及返回值類型。
[0038] 進一步地,對于危險函數(shù)庫模型而言,除了以上鍵值以外還可以包含一些后續(xù)用 于告警的信息,以及其他用途的信息,具體如下:上述方法還包括:
[0039] 獲取上述返回值類型為空的函數(shù)名所在代碼的文件路徑,以及從函數(shù)名開始到返 回值為空的代碼段,并記錄到上述危險函數(shù)庫模型。
[0040] 基于本發(fā)明實施例給出的危險函數(shù)庫模型,本發(fā)明實施例還提供了優(yōu)選的確定危 險變量的實現(xiàn)方案,如下:上述獲取待挖掘的代碼中使用了上述空指針的變量作為危險變 量;包括:
[0041] 獲取上述待挖掘的代碼中符合上述危險函數(shù)庫模型的鍵值,并且使用了上述危險 函數(shù)庫模型中的函數(shù)賦值的變量,作為危險變量。
[0042] 進一步地,對于危險函數(shù)庫模型而言,除了以上鍵值以外還可以包含一些后續(xù)用 于告警的信息,以及其他用途的信息,具體如下:在確定上述代碼行為產(chǎn)生空指針崩潰的代 碼行之后,上述方法還包括:
[0043] 獲取上述危險變量到上述危險代碼行之間的代碼,以及,上述返回值類型為空的 函數(shù)名所在代碼的文件路徑。
[0044] 在確定了會產(chǎn)生空指針崩潰的代碼行以后,還可以進行告警,告警的方式可以是 現(xiàn)實空指針崩潰提示,提示的信息可以有多種形式,本發(fā)明實施例給出了優(yōu)選的實現(xiàn)方式, 如下:在獲取上述危險變量到上述危險代碼行之間的代碼,以及,上述返回值類型為空的函 數(shù)名所在代碼的文件路徑之后,上述方法還包括:
[0045] 輸出告警信息,并輸出上