亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

一種源代碼中無效函數(shù)的查找方法和設(shè)備與流程

文檔序號:11216176閱讀:450來源:國知局
一種源代碼中無效函數(shù)的查找方法和設(shè)備與流程

本申請涉及互聯(lián)網(wǎng)信息處理技術(shù)及計算機技術(shù)領(lǐng)域,尤其涉及一種源代碼中無效函數(shù)的查找方法和設(shè)備。



背景技術(shù):

目前,隨著智能終端的普及,智能終端上的各種應(yīng)用(application,app)也得到了廣泛的應(yīng)用。

對于一款app,隨著版本迭代、功能變更、業(yè)務(wù)增加,該app的源代碼不斷地增加、修改以及刪除,特別是多人開發(fā)、長期開發(fā)的大型項目,app的源代碼中非常容易出現(xiàn)沒有被使用的廢棄代碼(這里可以稱之為無效類函數(shù))。

其中,所述無效類函數(shù)指app在運行時不再被調(diào)用或者引用的函數(shù)。由此可見,所述無效類函數(shù)是源代碼中的冗余部分,會導(dǎo)致app安裝包不必要地增大。

為了保證app安裝包中所包含的代碼得以精簡,需要對app的源代碼中包含的廢棄代碼進行查找,例如:對ios系統(tǒng)的objective-c代碼中的廢棄代碼進行查找。

但是,在對objective-c代碼中的廢棄代碼進行查找時,objective-c語言屬于一種動態(tài)類型語言,具備動態(tài)編程語言特性。但是,在編譯時無法查找廢棄代碼,這樣導(dǎo)致排查源代碼中包含的廢棄代碼的效率比較低。



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

有鑒于此,本申請實施例提出了一種源代碼中無效函數(shù)的查找方法和設(shè)備,用于解決現(xiàn)有技術(shù)中排查源代碼中包含的廢棄代碼存在的效率比較低的問題。

一種源代碼中無效函數(shù)的查找方法,包括:

提取源代碼中包含的函數(shù)表達式;

根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,其中,所述引用類型包含顯性引用類型、隱性引用類型;

若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。

一種源代碼中無效函數(shù)的查找設(shè)備,包括:

提取單元,用于提取源代碼中包含的函數(shù)表達式;

查找單元,用于根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,其中,所述引用類型包含顯性引用類型、隱性引用類型;

確定單元,用于若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。

本申請有益效果如下:

本申請實施例提取源代碼中包含的函數(shù)表達式;根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,所述引用類型包含顯性引用類型、隱性引用類型;若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。通過提取源代碼中包含的函數(shù)表達式,進而判斷所提取的函數(shù)表達式的引用類型,能夠有效查找出無效函數(shù),進而能夠幫助開發(fā)人員有效減小軟件安裝包的大小,提升排查源代碼中包含的廢棄代碼的效率。

附圖說明

為了更清楚地說明本申請實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡要介紹,顯而易見地,下面描述中的附圖僅僅是本申請的一些實施例,對于本領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

圖1為本申請實施例提供的一種源代碼中無效類型的查找方法的流程示意圖;

圖2為本申請實施例提供的一種源代碼中無效類型的查找設(shè)備的結(jié)構(gòu)示意圖。

具體實施方式

為了實現(xiàn)本申請的目的,本申請實施例提供了一種源代碼中無效函數(shù)的查找方法和設(shè)備,提取源代碼中包含的函數(shù)表達式;根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,所述引用類型包含顯性引用類型、隱性引用類型;若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。通過提取源代碼中包含的函數(shù)表達式,進而判斷所提取的函數(shù)表達式的引用類型,能夠有效查找出無效函數(shù),進而能夠幫助開發(fā)人員有效減小軟件安裝包的大小,提升排查源代碼中包含的廢棄代碼的效率。

需要說明的是,本申請實施例中所記載的引用類型的劃分類型包含但不限于:一種劃分方式為顯性應(yīng)用類型、隱性引用類型、無效類型;另一種劃分方式為直接引用類型、委托引用類型、屬性應(yīng)用類型、常量應(yīng)用類型、系統(tǒng)調(diào)用引用類型、特殊應(yīng)用類型、無效類型;等等。

這里的無效類型包含廢棄的、未被引用的函數(shù)表達式。

本申請實施例所應(yīng)用的場景包括但不限于:在對源代碼進行編譯階段,即通過編譯器將源代碼翻譯成機器能夠識別的代碼或者中間代碼,也就是從代碼到可執(zhí)行文件的過程中。

下面結(jié)合說明書附圖對本申請各個實施例作進一步地詳細描述。顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例?;诒旧暾堉械膶嵤├?,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本申請保護的范圍。

圖1為本申請實施例提供的一種源代碼中無效類型的查找方法的流程示意 圖。所述方法可以如下所示。

步驟101:提取源代碼中包含的函數(shù)表達式。

在步驟101中,在編譯器對源代碼進行編譯的過程中,可以提取該源代碼中包含的函數(shù)表達式。

這里的函數(shù)表達式可以是指一個函數(shù)表達式,也可以是指源代碼中包含的多個函數(shù)表達式,在本申請實施例中不做具體限定。

這里以源代碼是ios系統(tǒng)的代碼為例進行說明。

mach內(nèi)核被next公司的nextstep操作系統(tǒng)使用。在mach內(nèi)核上,一種可執(zhí)行的文件格式為mach-o(machobjectfileformat)。ios也同樣支持mach-o格式(machobject文件格式)的可執(zhí)行文件。

mach-o可以分為3個部分:header、segment和section。其中,header后面是segment,segment后面跟著section。segment可能會有多個,,一個segment可以包含多個section。header、segment、section是3種結(jié)構(gòu)體(一種數(shù)據(jù)結(jié)構(gòu))。mach-o格式的可執(zhí)行文件中所包含的程序信息被保存在這3種結(jié)構(gòu)體中。

具體地,header的結(jié)構(gòu)體在fat.h文件中。header定義了整個文件的數(shù)據(jù)讀寫方式、指令集信息。數(shù)據(jù)讀寫方式說明數(shù)據(jù)從左還是從右開始讀取、每個數(shù)據(jù)占多少字節(jié)。指令集信息說明該可執(zhí)行文件支持哪些指令集。mach-o格式的可執(zhí)行文件是個復(fù)合文件,一個可執(zhí)行文件當(dāng)中可以包含多套的指令集。ios操作系統(tǒng)在啟動這個進程的時候會加載最合適的某一套指令集。任何一套指令集的源代碼是一致的,所以此處我們?nèi)芜x一套指令集用以分析即可。在選定一套指令集之后,可以得到這套指令集中的segment數(shù)據(jù)。

segment的結(jié)構(gòu)體在loader.h文件中。segment是信息的大綱,相當(dāng)于一本書的目錄。segment可以有多個,每個都有不同的名字,主要的segment名為_text、_data。每個segment可以有多個section,例如_datasegment有_objc_selrefs、_objc_protolist、_cfstring、_objc_ivar等section,_text segment有_objc_methname、_const、_cstring等section。

section的結(jié)構(gòu)體在loader.h文件中。section是具體某種信息的集合,所有這類信息都在這個結(jié)構(gòu)體中。例如_textsegment的_objc_methnamesection是所有objective-c的方法信息(又可稱之為函數(shù)信息),_datasegment的_objc_selrefssection是所有objective-c引用的方法信息。

也就是說,對于源代碼,可以從mach-o格式的可執(zhí)行文件中讀取函數(shù)表達式。

例如:根據(jù)_textsegment下的_objc_methnamesection得到可執(zhí)行文件中所有的函數(shù)表達式,保存到_methnames(methodnames,全部函數(shù)表達式)數(shù)組。

根據(jù)_datasegment下的_objc_selrefssection得到可執(zhí)行文件中被顯式引用的函數(shù)表達式,保存到_selrefs(selectreferences,引用函數(shù)表達式)數(shù)組。

根據(jù)_datasegment下的_objc_protolistsection得到可執(zhí)行文件中定義的委托引用類型的函數(shù)表達式,保存到_protolists(protocollists,委托函數(shù)表達)數(shù)組。

根據(jù)_datasegment下的_objc_ivarsection得到可執(zhí)行文件中屬性應(yīng)用類型的函數(shù)表達式。xcode編譯器根據(jù)屬性名稱自動生成getter函數(shù)、setter函數(shù),其getter函數(shù)名為屬性名,其setter函數(shù)名為set+屬性名且屬性名稱首字母大寫+英文冒號,例如屬性”temp”,其getter方法名為”temp”,其setter方法名為”settemp:”。根據(jù)屬性計算出對應(yīng)的getter函數(shù)名、setter函數(shù)名,并保存到_ivarmeths(ivarmethods,屬性函數(shù)表達式)數(shù)組。

根據(jù)_datasegment下的_cfstringsection得到可執(zhí)行文件中常量引用類型的函數(shù)表達式,保存到_cfstrings(corefoundationstrings,常量引用類型的函數(shù)表達式)數(shù)組。一般字符串常量中包含nsselectorfromstring方式引用的函數(shù)表達式,屬于隱性引用類型,不容易被檢測,但會將函數(shù)表達式作為字符串常量記錄下來。

步驟102:根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型。

其中,所述引用類型包含顯性引用類型、隱性引用類型。

其中,所述隱性引用類型包含委托型引用類型、屬性型引用類型、常量型引用類型中至少一種。

在步驟102中,對于提取到的函數(shù)表達式,可以判斷提取到的所述函數(shù)表達式是否屬于顯性引用類型,或判斷提取到的所述函數(shù)表達式是否屬于隱性引用類型。

例如:根據(jù)步驟101中所記載的內(nèi)容,_methnames數(shù)組中保存了源代碼中的所有函數(shù)表達式,那么從_methnames數(shù)組中抽取出一個函數(shù)表達式,判斷該函數(shù)表達式是否屬于顯性引用類型,若不是,則進一步判斷該函數(shù)表達式是否屬于隱性引用類型;或者,判斷該函數(shù)表達式是否屬于隱性引用類型,若不是,則進一步判斷該函數(shù)表達式是否屬于顯性引用類型,這里對于如何判斷不做具體限定。

需要說明的是,經(jīng)過判斷之后,無論該函數(shù)表達式是否屬于無效類函數(shù),將該函數(shù)表達式從_methnames數(shù)組移除。

也就是說,本申請實施例中所記載的無效類函數(shù)的查找方法可以基于_methnames數(shù)組,對該_methnames數(shù)組進行遍歷操作,以找到源代碼中包含的無效類函數(shù)。

可選地,本申請實施例在判斷結(jié)果為提取到的所述函數(shù)表達式不屬于顯性引用類型且提取到的所述函數(shù)表達式不屬于隱性引用類型時,還可以進一步判斷提取到的所述函數(shù)表達式是否屬于白名單中包含的函數(shù)表達式。其中,所述白名單中包含的函數(shù)表達式為特殊引用類型的函數(shù)表達式。

需要說明的是,白名單中包含的函數(shù)表達式為特殊引用類型的函數(shù)表達式,這里的特殊引用類型的函數(shù)表達式包含系統(tǒng)引用類型的函數(shù)表達式、用戶白名單函數(shù)表達式方法,分別從系統(tǒng)函數(shù)表達式文件、白名單函數(shù)表達式文件 中讀入,并保存到_ignoremeths數(shù)組。

其中,系統(tǒng)函數(shù)表達式文件,中包含由系統(tǒng)調(diào)用的系統(tǒng)函數(shù)表達式,源代碼中一般不調(diào)用系統(tǒng)函數(shù)表達式,但容易被認為這些函數(shù)表達式屬于無效函數(shù),因此需要過濾系統(tǒng)函數(shù)表達式。

例如:對于mach-o格式的可執(zhí)行文件,根據(jù)_textsegment下的_objc_methnamesection得到可執(zhí)行文件中包含的所有的系統(tǒng)函數(shù)表達式。因系統(tǒng)的ios可執(zhí)行文件既多又大,分析一次耗時嚴(yán)重。且同一版本的ios系統(tǒng)方法完全一致,沒有必要每次分析。因此,單獨分析一次系統(tǒng)可執(zhí)行文件,將得到的系統(tǒng)函數(shù)表達式保存到系統(tǒng)函數(shù)表達式文件中,使用時只需讀取系統(tǒng)函數(shù)表達式文件即可。

白名單函數(shù)表達式文件,可以是由用戶將一些函數(shù)表達式(確實未引用但要忽略的函數(shù)表達式,例如提供給外部應(yīng)用調(diào)用的接口函數(shù)表達式、服務(wù)端下發(fā)調(diào)用的函數(shù)表達式等等)添加到白名單函數(shù)表達式文件中。

步驟103:若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。

在步驟103中,若判斷結(jié)果為提取到的所述函數(shù)表達式不屬于顯性引用類型且提取到的所述函數(shù)表達式不屬于隱性引用類型,則確定查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型。

可選地,若判斷結(jié)果為提取到的所述函數(shù)表達式不屬于顯性引用類型且提取到的所述函數(shù)表達式不屬于隱性引用類型且判斷結(jié)果是提取到的所述函數(shù)表達式不屬于白名單中包含的函數(shù)表達式,則確定查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型。

下面以從_methnames數(shù)組中取出函數(shù)表達式為item進行查找說明。

第一步,比對item是否為顯性引用類型的函數(shù)表達式,即判斷_selrefs數(shù)組中有無item,如有,則確定其為顯性應(yīng)用類型的函數(shù)表達式,結(jié)束判斷;否則進入下一步判斷。

第二步,比對item是否屬于delegate(委托型引用類型的函數(shù)表達式),即判斷_protolists數(shù)組中有無item,如有,則確定其為委托型引用類型的函數(shù)表達式,結(jié)束判斷;否則進入下一步判斷。

第三步,比對item是否屬性的getter、setter(屬性型引用類型的函數(shù)表達式),即判斷_ivarmeths數(shù)組中有無item,如有,則確定其為屬性型引用類型的函數(shù)表達式,結(jié)束判斷;否則進入下一步判斷。

第四步,比對item是否nsselectorfromstring(常量型引用類型的函數(shù)表達式),即判斷_cfstrings數(shù)組中有無item,如有,則確定其為常量型引用類型的函數(shù)表達式,結(jié)束判斷;否則進入下一步判斷。

第五步,比對item是否在白名單中,即判斷_ignoremeths數(shù)組中有無item,如有,則確定其為有效函數(shù),結(jié)束判斷;否則進入下一步。

第六步,經(jīng)過層層篩選,進入這步的item就是未引用,即無效函數(shù)。

由于只通過第一步得到的無效函數(shù)結(jié)果,因objective-c語言特性而包含了大量實際被引用的函數(shù),導(dǎo)致準(zhǔn)確度非常低,幾乎不具有實用性。而結(jié)合步驟一至五得到的無效函數(shù)結(jié)果,準(zhǔn)確率幾乎100%。

以上步驟中,第一步至第五步的執(zhí)行順序可以不分先后,可以調(diào)換執(zhí)行順序,隨機排列組合執(zhí)行順序,這里不做限定。

除第一步,其余4個步驟都是可選的。但去掉任一步,都會導(dǎo)致結(jié)果準(zhǔn)確率大幅降低。

通過本申請實施例所提供的技術(shù)方案,提取源代碼中包含的函數(shù)表達式;根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,所述引用類型包含顯性引用類型、隱性引用類型;若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。通過提取源代碼中包含的函數(shù)表達式,進而判斷所提取的函數(shù)表達式的引用類型,能夠有效查找出無效函數(shù),進而能夠幫助開發(fā)人員有效減小軟件安裝包的大小,提升排查源代碼中包含的廢棄代碼的效率。

圖2為本申請實施例提供的一種源代碼中無效類型的查找設(shè)備的結(jié)果示意圖。所述查找設(shè)備包括:提取單元21、查找單元22和確定單元23,其中:

提取單元21,用于提取源代碼中包含的函數(shù)表達式;

查找單元22,用于根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,其中,所述引用類型包含顯性引用類型、隱性引用類型;

確定單元23,用于若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。

在本申請的另一個實施例中,所述隱性引用類型包含委托型引用類型、屬性型引用類型、常量型引用類型中至少一種。

在本申請的另一個實施例中,所述查找單元22根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,包括:

判斷提取到的所述函數(shù)表達式是否屬于顯性引用類型,或判斷提取到的所述函數(shù)表達式是否屬于隱性引用類型。

在本申請的另一個實施例中,所述查找單元22查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,包括:

若判斷結(jié)果為提取到的所述函數(shù)表達式不屬于顯性引用類型且提取到的所述函數(shù)表達式不屬于隱性引用類型,則確定查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型。

在本申請的另一個實施例中,所述查找單元22查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,包括:

進一步判斷提取到的所述函數(shù)表達式是否屬于白名單中包含的函數(shù)表達式,其中,所述白名單中包含的函數(shù)表達式為特殊引用類型的函數(shù)表達式;

若判斷結(jié)果是提取到的所述函數(shù)表達式不屬于白名單中包含的函數(shù)表達式,則確定查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型。

需要說明的是,本申請實施例所提供的查找設(shè)備可以通過硬件方式實現(xiàn), 也可以通過軟件方式實現(xiàn),這里不做限定。查找設(shè)備提取源代碼中包含的函數(shù)表達式;根據(jù)預(yù)設(shè)的函數(shù)表達式的引用類型,查找提取到的所述函數(shù)表達式對應(yīng)的引用類型,所述引用類型包含顯性引用類型、隱性引用類型;若查找結(jié)果為無法確定所述函數(shù)表達式對應(yīng)的引用類型,則確定提取到的所述函數(shù)表達式為無效函數(shù)。通過提取源代碼中包含的函數(shù)表達式,進而判斷所提取的函數(shù)表達式的引用類型,能夠有效查找出無效函數(shù),進而能夠幫助開發(fā)人員有效減小軟件安裝包的大小,提升排查源代碼中包含的廢棄代碼的效率。

本領(lǐng)域的技術(shù)人員應(yīng)明白,本申請的實施例可提供為方法、裝置(設(shè)備)、或計算機程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學(xué)存儲器等)上實施的計算機程序產(chǎn)品的形式。

本申請是參照根據(jù)本申請實施例的方法、裝置(設(shè)備)和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。

這些計算機程序指令也可存儲在能引導(dǎo)計算機或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。

這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計算機或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個 流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。

盡管已描述了本申請的優(yōu)選實施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實施例以及落入本申請范圍的所有變更和修改。

顯然,本領(lǐng)域的技術(shù)人員可以對本申請進行各種改動和變型而不脫離本申請的精神和范圍。這樣,倘若本申請的這些修改和變型屬于本申請權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本申請也意圖包含這些改動和變型在內(nèi)。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1