本發(fā)明涉及軟件工程技術(shù)領(lǐng)域,特別是指一種內(nèi)存重復(fù)釋放錯誤檢測方法。
背景技術(shù):
一些高級編程語言如c、c++,因?yàn)閳?zhí)行效率高,開發(fā)程序靈活等特點(diǎn),受到程序員的廣泛歡迎;尤其是c語言在嵌入式系統(tǒng)開發(fā)領(lǐng)域占據(jù)十分重要的地位。然而這類開發(fā)語言在內(nèi)存的管理上卻存在不足,尤其是申請堆中的動態(tài)內(nèi)存,需要開發(fā)人員自己去維護(hù)。一旦出現(xiàn)內(nèi)存重復(fù)釋放或者訪問非法地址的內(nèi)存等情況,就會引發(fā)程序的嚴(yán)重異常,甚至崩潰。對小規(guī)模程序,這個缺陷并不突出,內(nèi)存操作有問題時通過代碼走查和調(diào)試便可十分容易地定位到問題,但對于包含百萬行代碼的大型項目,程序執(zhí)行邏輯可能非常復(fù)雜,在這種場景下定位內(nèi)存錯誤操作這類問題會變得十分困難。
目前國內(nèi)外科研人員和軟件開發(fā)人員研究實(shí)踐了許多內(nèi)存管理的方法,防止開發(fā)人員操作內(nèi)存錯誤,主要包括預(yù)防和靜態(tài)代碼走查兩種技術(shù)。
1.預(yù)防技術(shù)
開發(fā)人員在開發(fā)程序時涉及到管理堆中的內(nèi)存時要格外注意,一般遵循“哪里申請,哪里釋放”的原則,防止只有在不適當(dāng)?shù)奈恢弥貜?fù)釋放內(nèi)存。這種策略有很多失效的場景,例如在很多協(xié)議開發(fā)中,不同層次之間通過消息機(jī)制傳遞信息,經(jīng)常需要在發(fā)送層申請該消息內(nèi)存,在接收層處理該消息,并且負(fù)責(zé)釋放;同樣在一些程序開發(fā)中,需要在被調(diào)函數(shù)中申請堆內(nèi)存,然后將該內(nèi)存地址返回給調(diào)用函數(shù)使用并最后釋放??梢?,預(yù)防策略只在小范圍程序中可取。
2.靜態(tài)代碼走查技術(shù)
測試階段遇到內(nèi)存的錯誤操作時,最直接的想法是根據(jù)系統(tǒng)崩潰現(xiàn)場導(dǎo)出函數(shù)調(diào)用棧,定位到引起系統(tǒng)崩潰的內(nèi)存塊(即目標(biāo)內(nèi)存塊),采用靜態(tài)代碼走查的方式定位程序中的錯誤。
這種方式主要有兩個不足:
1)系統(tǒng)崩潰現(xiàn)場中的函數(shù)調(diào)用棧是引起系統(tǒng)崩潰的“偽”原因;
系統(tǒng)崩潰時可以通過一些手段獲取崩潰前的函數(shù)調(diào)用棧,如在嵌入式開發(fā)中使用trace32(德國lauterbach公司研制開發(fā)的一款仿真測試工具)抓取崩潰現(xiàn)場。函數(shù)調(diào)用棧詳細(xì)記錄了系統(tǒng)崩潰前的執(zhí)行流程,并說明崩潰的原因。但是很多場景下它不是系統(tǒng)崩潰的根本原因,只是最后表現(xiàn)在這里,例如內(nèi)存重復(fù)釋放引起的系統(tǒng)崩潰,因此,根據(jù)函數(shù)調(diào)用棧去定位問題經(jīng)常沒有收獲。
2)靜態(tài)代碼走查方式十分困難
在一些大型項目中,通常包含上百萬行的代碼,為了考慮更好的移植性,兼容更多的接口,程序中往往包含大量的宏定義開關(guān),這導(dǎo)致確定有效代碼十分困難;即使成功確定了有效代碼,由于程序的執(zhí)行邏輯可能非常復(fù)雜,代碼走查需要遍歷的分支可能非常多,因而還是十分耗費(fèi)精力。
總之,現(xiàn)有技術(shù)中的內(nèi)存檢測方法存在適用范圍有限、排錯復(fù)雜、效率低下等問題,難以適應(yīng)繁重的調(diào)試工作。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明提出一種內(nèi)存重復(fù)釋放錯誤檢測方法,其能夠簡單高效地定位代碼中引起內(nèi)存錯誤釋放的位置,快速排查代碼中的邏輯錯誤。
基于上述目的,本發(fā)明提供的技術(shù)方案是:
一種內(nèi)存重復(fù)釋放錯誤檢測方法,其包括以下步驟:
(1)建立內(nèi)存池和操作隊列池;操作隊列池中的操作隊列與內(nèi)存池中的內(nèi)存塊一一對應(yīng),每一個內(nèi)存塊包括內(nèi)存塊標(biāo)識字段、占用狀態(tài)字段和存儲數(shù)據(jù)字段,操作隊列中的每個元素包括操作類型字段、代碼文件標(biāo)識字段、代碼行號字段和操作時間字段;
(2)將被調(diào)試程序?qū)?nèi)存池中內(nèi)存塊的每一次申請或釋放操作記錄到該內(nèi)存塊所對應(yīng)的操作隊列中;
(3)對于每一次內(nèi)存操作,若該次操作的類型為釋放內(nèi)存,且該次操作所對應(yīng)的內(nèi)存塊的占用狀態(tài)字段為未占用,則引發(fā)人為系統(tǒng)崩潰;
(4)當(dāng)系統(tǒng)發(fā)生自然崩潰或人為崩潰時,根據(jù)崩潰現(xiàn)場確定引起系統(tǒng)崩潰的內(nèi)存塊,從操作隊列池中查找該內(nèi)存塊所對應(yīng)的操作隊列,根據(jù)該操作隊列所記錄的信息在程序代碼中定位導(dǎo)致程序錯誤的代碼位置。
可選的,步驟(4)中根據(jù)操作隊列所記錄的信息在程序代碼中定位導(dǎo)致程序錯誤的代碼位置的具體方式為:
(401)將操作隊列中的元素順序反轉(zhuǎn)并另行存儲,形成原操作隊列的鏡像操作隊列;
(402)從當(dāng)前鏡像操作隊列的頭部開始逐一取出元素,直到取出操作類型為釋放的元素;
(403)從當(dāng)前鏡像操作隊列的頭部再取出一個元素,判斷該元素的操作類型,若操作類型也為釋放,則定位兩次連續(xù)釋放操作所對應(yīng)的代碼位置,結(jié)束檢測;若操作類型為申請,則繼續(xù)后續(xù)步驟;
(404)判斷最后取出的兩個元素的對應(yīng)操作是否邏輯匹配,若匹配則重復(fù)步驟(402),否則繼續(xù)后續(xù)步驟;
(405)從當(dāng)前鏡像操作隊列的頭部開始向后查找第一個與當(dāng)前最后一個被取出的釋放元素邏輯匹配的申請元素,再從該申請元素開始向前查找最近的釋放元素,判斷該最近的釋放元素是否與本步驟中的申請元素邏輯匹配,若是則定位本步驟中所涉兩個釋放元素的對應(yīng)代碼位置,結(jié)束檢測;否則從當(dāng)前鏡像操作隊列的頭部開始逐一取出元素直至取出本步驟所述的最近的釋放元素,然后重復(fù)本步驟(405)。
可選的,操作隊列的存儲形式為環(huán)形隊列。
從上面的敘述可以看出,本發(fā)明技術(shù)方案的有益效果在于:
1、本發(fā)明利用操作隊列池詳細(xì)而完備地記錄內(nèi)存塊的使用情況,為內(nèi)存調(diào)用排錯提供了堅實(shí)基礎(chǔ)。
2、本發(fā)明方法通過引入人為系統(tǒng)崩潰的方式提高了對代碼錯誤的敏感度,便于快速暴露錯誤所在。
3、本發(fā)明成功解決了現(xiàn)有技術(shù)中預(yù)防技術(shù)和靜態(tài)代碼走查技術(shù)等技術(shù)的缺點(diǎn),不需要根據(jù)宏定義確定有效代碼,不需要走查大量的程序,依據(jù)系統(tǒng)動態(tài)唯一的執(zhí)行流程,不但可定位到明顯的內(nèi)存重復(fù)釋放bug,也可以發(fā)現(xiàn)隱藏在復(fù)雜流程中內(nèi)存重復(fù)釋放的bug,提高了解決系統(tǒng)崩潰問題的效率。
總之,本發(fā)明方法嚴(yán)謹(jǐn)、簡潔而緊湊,并且便于實(shí)現(xiàn),尤其是采用了內(nèi)存池和操作隊列池這種數(shù)據(jù)結(jié)構(gòu)為內(nèi)存調(diào)用排錯提供了堅實(shí)基礎(chǔ),相對于現(xiàn)有技術(shù)能夠更加簡單高效地定位代碼中引起內(nèi)存重復(fù)釋放錯誤的位置,是對現(xiàn)有代碼排查調(diào)試技術(shù)的一種重要改進(jìn)。
附圖說明
為了更加清楚地描述本專利,下面提供一幅或多幅附圖,這些附圖旨在對本專利的背景技術(shù)、技術(shù)原理和/或某些具體實(shí)施方案做出輔助說明。需要注意的是,這些附圖可以給出也可以不給出一些在本專利文字部分已有描述且屬于本領(lǐng)域普通技術(shù)人員公知常識的具體細(xì)節(jié);并且,因?yàn)楸绢I(lǐng)域的普通技術(shù)人員完全可以結(jié)合本專利已公開的文字內(nèi)容和/或附圖內(nèi)容,在不付出任何創(chuàng)造性勞動的情況下設(shè)計出更多的附圖,因此下面這些附圖可以涵蓋也可以不涵蓋本專利文字部分所敘述的所有技術(shù)方案。此外,這些附圖的具體內(nèi)涵需要結(jié)合本專利的文字內(nèi)容予以確定,當(dāng)本專利的文字內(nèi)容與這些附圖中的某個明顯結(jié)構(gòu)不相符時,需要結(jié)合本領(lǐng)域的公知常識以及本專利其他部分的敘述來綜合判斷到底是本專利的文字部分存在筆誤,還是附圖中存在繪制錯誤。特別地,以下附圖均為實(shí)例性質(zhì)的圖片,并非旨在暗示本專利的保護(hù)范圍,本領(lǐng)域的普通技術(shù)人員通過參考本專利所公開的文字內(nèi)容和/或附圖內(nèi)容,可以在不付出任何創(chuàng)造性勞動的情況下設(shè)計出更多的附圖,這些新附圖所代表的技術(shù)方案依然在本專利的保護(hù)范圍之內(nèi)。
圖1是本發(fā)明實(shí)施例中內(nèi)存的數(shù)據(jù)結(jié)構(gòu)示意圖;
圖2是本發(fā)明實(shí)施例中系統(tǒng)運(yùn)行時的流程圖;
圖3是本發(fā)明實(shí)施例中排錯過程的流程圖。
具體實(shí)施方式
為了便于本領(lǐng)域技術(shù)人員對本專利技術(shù)方案的理解,同時,為了使本專利的技術(shù)目的、技術(shù)方案和有益效果更加清楚,并使權(quán)利要求書的保護(hù)范圍得到充分支持,下面以具體案例的形式對本專利的技術(shù)方案做出進(jìn)一步的、更詳細(xì)的說明。
一種內(nèi)存重復(fù)釋放錯誤檢測方法,其包括以下步驟:
(1)建立內(nèi)存池和操作隊列池;操作隊列池中的操作隊列與內(nèi)存池中的內(nèi)存塊一一對應(yīng),每一個內(nèi)存塊包括內(nèi)存塊標(biāo)識字段、占用狀態(tài)字段和存儲數(shù)據(jù)字段,操作隊列中的每個元素包括操作類型字段、代碼文件標(biāo)識字段、代碼行號字段和操作時間字段;
(2)將被調(diào)試程序?qū)?nèi)存池中內(nèi)存塊的每一次申請或釋放操作記錄到該內(nèi)存塊所對應(yīng)的操作隊列中;
(3)對于每一次內(nèi)存操作,若該次操作的類型為釋放內(nèi)存,且該次操作所對應(yīng)的內(nèi)存塊的占用狀態(tài)字段為未占用,則引發(fā)人為系統(tǒng)崩潰;
(4)當(dāng)系統(tǒng)發(fā)生自然崩潰或人為崩潰時,根據(jù)崩潰現(xiàn)場確定引起系統(tǒng)崩潰的內(nèi)存塊,從操作隊列池中查找該內(nèi)存塊所對應(yīng)的操作隊列,根據(jù)該操作隊列所記錄的信息在程序代碼中定位導(dǎo)致程序錯誤的代碼位置。
可選的,步驟(4)中根據(jù)操作隊列所記錄的信息在程序代碼中定位導(dǎo)致程序錯誤的代碼位置的具體方式為:
(401)將操作隊列中的元素順序反轉(zhuǎn)并另行存儲,形成原操作隊列的鏡像操作隊列;
(402)從當(dāng)前鏡像操作隊列的頭部開始逐一取出元素,直到取出操作類型為釋放的元素;
(403)從當(dāng)前鏡像操作隊列的頭部再取出一個元素,判斷該元素的操作類型,若操作類型也為釋放,則定位兩次連續(xù)釋放操作所對應(yīng)的代碼位置,結(jié)束檢測;若操作類型為申請,則繼續(xù)后續(xù)步驟;
(404)判斷最后取出的兩個元素的對應(yīng)操作是否邏輯匹配,若匹配則重復(fù)步驟(402),否則繼續(xù)后續(xù)步驟;
(405)從當(dāng)前鏡像操作隊列的頭部開始向后查找第一個與當(dāng)前最后一個被取出的釋放元素邏輯匹配的申請元素,再從該申請元素開始向前查找最近的釋放元素,判斷該最近的釋放元素是否與本步驟中的申請元素邏輯匹配,若是則定位本步驟中所涉兩個釋放元素的對應(yīng)代碼位置,結(jié)束檢測;否則從當(dāng)前鏡像操作隊列的頭部開始逐一取出元素直至取出本步驟所述的最近的釋放元素,然后重復(fù)本步驟(405)。
這種將原操作隊列另存為鏡像隊列的方式別具匠心,因?yàn)楹罄m(xù)的排查都是按照時間順序向前排查的,采用這種鏡像隊列的數(shù)據(jù)結(jié)構(gòu)恰好使得“按照時間順序排查”這一操作與隊列的“先進(jìn)先出”規(guī)則相符合,并且排查后的元素被從隊列中剔除,這使得排查過程非常容易通過迭代的方式實(shí)現(xiàn),可見這種鏡像隊列的數(shù)據(jù)結(jié)構(gòu)有利于提高排錯算法的算法效率。
可選的,操作隊列的存儲形式為環(huán)形隊列。
具體的,如圖2和3所示,一種內(nèi)存重復(fù)釋放錯誤檢測方法,其包括以下步驟:
步驟1,建立如圖1所示的內(nèi)存池和操作隊列池;
對于內(nèi)存池,將整個內(nèi)存區(qū)劃分為t個內(nèi)存塊,這些內(nèi)存塊可以大小相等,也可以大小不等,每個內(nèi)存塊包含塊頭信息(內(nèi)存塊的狀態(tài)和標(biāo)識m_id)。內(nèi)存塊實(shí)現(xiàn)時可以采用類似如下的結(jié)構(gòu)體:
當(dāng)內(nèi)存塊已經(jīng)分配給應(yīng)用程序時,其狀態(tài)為占用態(tài);當(dāng)釋放內(nèi)存塊時,其狀態(tài)由占用態(tài)轉(zhuǎn)化為空閑態(tài)。標(biāo)識m_id從0到t-1,是每個內(nèi)存塊在內(nèi)存池中的唯一標(biāo)識,同時是內(nèi)存池到操作隊列池映射的關(guān)鍵;對于操作隊列池,它包含t個大小相等的內(nèi)存塊,每個內(nèi)存塊是一個操作隊列,能夠容納內(nèi)存池中內(nèi)存塊的n次操作,每個操作包含四項信息:操作類型(申請或釋放)、文件標(biāo)識、行號和時間。當(dāng)應(yīng)用程序申請或釋放內(nèi)存池中的內(nèi)存時,要向操作隊列中添加操作,待系統(tǒng)崩潰時分析使用。操作隊列實(shí)現(xiàn)時可以采用類似如下的結(jié)構(gòu)體:
因?yàn)閮?nèi)存池中的內(nèi)存塊會被反復(fù)操作,操作隊列池中有限的內(nèi)存空間不允許完全記錄內(nèi)存塊的所有操作,所以可以設(shè)置每個操作隊列最多只記錄n次操作,并將操作隊列設(shè)置為環(huán)形隊列的存儲形式。
步驟2,啟動系統(tǒng),執(zhí)行被調(diào)試程序,被調(diào)試程序的所有內(nèi)存操作均在內(nèi)存池中進(jìn)行,且每次操作都被記錄在操作隊列池中。
系統(tǒng)在啟動時調(diào)用系統(tǒng)api申請內(nèi)存池和操作隊列池中的內(nèi)存,對其進(jìn)行初始化,同時為應(yīng)用程序提供申請內(nèi)存和釋放內(nèi)存函數(shù)的接口,不再是系統(tǒng)調(diào)用malloc和free那種方式,在應(yīng)用程序調(diào)用這些接口時需要提供調(diào)用的文件標(biāo)識、行號和系統(tǒng)時間,以便在操作隊列中記錄這些信息。當(dāng)應(yīng)用程序申請指定大小的內(nèi)存時,系統(tǒng)從內(nèi)存池中尋找空閑態(tài)且大小滿足的內(nèi)存塊m返回給應(yīng)用程序,修改m的塊頭狀態(tài)信息為占用態(tài),根據(jù)m的塊頭信息m_id查找操作隊列池中對應(yīng)的操作隊列,將應(yīng)用程序提供的文件標(biāo)識、行號和系統(tǒng)時間信息組合成一個操作,并添加到操作隊列中,同時操作隊列的隊尾指針后移;當(dāng)應(yīng)用程序釋放某個地址的內(nèi)存塊m時,系統(tǒng)根據(jù)m的塊頭信息m_id,查找操作隊列池中對應(yīng)的操作隊列,將應(yīng)用程序提供的文件標(biāo)識、行號和系統(tǒng)時間信息組合成一個操作,并添加到操作隊列中,同時操作隊列的隊尾指針后移,完成后查詢m的塊頭狀態(tài),若為占用態(tài),將其修改為空閑態(tài),該釋放操作結(jié)束,若為空閑態(tài),當(dāng)前操作釋放了本來為空閑態(tài)的內(nèi)存,這是明顯的內(nèi)存重復(fù)釋放。
值得注意的是,由于已經(jīng)被申請的內(nèi)存塊將處于被占用的狀態(tài)而無法被其他進(jìn)程或線程所申請,因此操作隊列中不會出現(xiàn)連續(xù)兩個申請操作。若操作隊列中連續(xù)出現(xiàn)兩個釋放操作,則屬于明顯的內(nèi)存重復(fù)釋放錯誤,此時本方法會引起系統(tǒng)的人為崩潰,從而及時終止程序并進(jìn)入排錯流程,便于快速暴露并排查錯誤。一般情況下,操作隊列中的所有操作是以申請和釋放相間的形式排列的,但是被調(diào)試程序的不同模塊之間可能存在潛在的邏輯錯誤,導(dǎo)致一個模塊申請的內(nèi)存被另一個模塊釋放,則當(dāng)申請內(nèi)存的模塊再次讀取該內(nèi)存塊時就會出現(xiàn)讀取錯誤,從而導(dǎo)致系統(tǒng)的自然崩潰,此時本方法即會進(jìn)入排錯流程幫助用戶查找錯誤所在。
步驟3,當(dāng)系統(tǒng)發(fā)生崩潰時進(jìn)入排錯流程。該流程如圖3所示:
①將操作隊列中的元素順序反轉(zhuǎn)并另行存儲,形成原操作隊列的鏡像操作隊列;
②從當(dāng)前鏡像操作隊列的頭部開始逐一取出元素,直到取出操作類型為釋放的元素p;
③從當(dāng)前鏡像操作隊列的頭部再取出一個元素q,判斷該元素q的操作類型,若操作類型也為釋放,則定位兩次連續(xù)釋放操作所對應(yīng)的代碼位置,結(jié)束檢測;若操作類型為申請,則繼續(xù)后續(xù)步驟;
④判斷最后取出的兩個元素p和q的對應(yīng)操作是否邏輯匹配,若匹配則重復(fù)步驟②,否則繼續(xù)后續(xù)步驟;
⑤從當(dāng)前鏡像操作隊列的頭部開始向后查找第一個與當(dāng)前最后一個被取出的釋放元素邏輯匹配的申請元素,再從該申請元素開始在當(dāng)前鏡像操作隊列中向前查找最近的釋放元素,判斷該最近的釋放元素是否與本步驟中的申請元素邏輯匹配,若是則表示一個申請操作出現(xiàn)了連續(xù)兩個邏輯匹配的釋放操作,這是一個潛在的內(nèi)存重復(fù)釋放錯誤,此時可以定位這兩個釋放操作的對應(yīng)代碼位置,結(jié)束檢測;否則表示該最近的釋放元素可能是引起內(nèi)存錯誤的原因,此時從當(dāng)前鏡像操作隊列的頭部開始逐一取出元素直至取出該最近的釋放元素,然后重復(fù)本步驟⑤。
本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,以上方法中的“當(dāng)前”顯然是指該“當(dāng)前”所在語境的對應(yīng)時刻,因此不同步驟中的“當(dāng)前鏡像操作隊列”顯然不一定是元素相同的隊列。
以上方法中所謂“邏輯匹配”是指申請操作與釋放操作對應(yīng)的代碼不存在邏輯錯誤。
以上方法中,從隊列中“取出”一個隊列元素后該隊列元素即被從該隊列中刪除。
總之,本發(fā)明成功解決了預(yù)防技術(shù)、靜態(tài)代碼走查技術(shù)等技術(shù)的缺點(diǎn),不需要根據(jù)宏定義確定有效代碼,不需要走查大量的程序,依據(jù)系統(tǒng)動態(tài)唯一的執(zhí)行流程,不但可定位到明顯的內(nèi)存重復(fù)釋放bug,也可以發(fā)現(xiàn)隱藏在復(fù)雜流程中內(nèi)存重復(fù)釋放的bug,提高了解決系統(tǒng)崩潰問題的效率,是對現(xiàn)有技術(shù)的一種重要改進(jìn)。
需要注意的是,本專利權(quán)利要求書中所謂的“步驟”是指用于實(shí)現(xiàn)本專利方法的任一具體流程中的一個必要環(huán)節(jié),并不包含對步驟執(zhí)行順序的限定,本領(lǐng)域普通技術(shù)人員完全能夠在理解了本專利某一權(quán)項中各步驟間的內(nèi)在邏輯的基礎(chǔ)上,對這些步驟的具體執(zhí)行順序做出各種符合這種內(nèi)在邏輯的實(shí)際安排。因此,任何一種應(yīng)用了本專利某一權(quán)項中所有步驟的、符合這些步驟間的內(nèi)在邏輯的、用于實(shí)現(xiàn)本專利方法的,且具有特定執(zhí)行順序的具體步驟序列,均在本專利的保護(hù)范圍之內(nèi)。
需要理解的是,上述對于本專利具體實(shí)施方式的敘述僅僅是為了便于本領(lǐng)域普通技術(shù)人員理解本專利方案而列舉的個例性描述,并非暗示本專利的保護(hù)范圍僅僅被限制在這些個例中,本領(lǐng)域普通技術(shù)人員完全可以在對本專利技術(shù)方案做出充分理解的前提下,以不付出任何創(chuàng)造性勞動的形式,通過對本專利所列舉的各個例采取組合技術(shù)特征、替換部分技術(shù)特征、加入更多技術(shù)特征等等方式,得到更多的具體實(shí)施方式,所有這些具體實(shí)施方式均在本專利權(quán)利要求書的涵蓋范圍之內(nèi),因此,這些新的具體實(shí)施方式也應(yīng)在本專利的保護(hù)范圍之內(nèi)。
此外,出于簡化敘述的目的,本專利也可能沒有列舉一些尋常的具體實(shí)施方案,這些方案是本領(lǐng)域普通技術(shù)人員在理解了本專利技術(shù)方案后能夠自然而然想到的,顯然,這些方案也應(yīng)包含在本專利的保護(hù)范圍之內(nèi)。
出于簡化敘述的目的,上述各具體實(shí)施方式對于技術(shù)細(xì)節(jié)的公開程度可能僅僅達(dá)到本領(lǐng)域技術(shù)人員可以自行決斷的程度,即,對于上述具體實(shí)施方式?jīng)]有公開的技術(shù)細(xì)節(jié),本領(lǐng)域普通技術(shù)人員完全可以在不付出任何創(chuàng)造性勞動的情況下,在本專利技術(shù)方案的充分提示下,借助于教科書、工具書、論文、專利、音像制品等等已公開文獻(xiàn)予以完成,或者,這些細(xì)節(jié)是在本領(lǐng)域普通技術(shù)人員的通常理解下,可以根據(jù)實(shí)際情況自行作出決定的內(nèi)容??梢姡词共还_這些技術(shù)細(xì)節(jié),也不會對本專利技術(shù)方案的公開充分性造成影響。
總之,在結(jié)合了本專利說明書對權(quán)利要求書保護(hù)范圍的解釋作用的基礎(chǔ)上,任何落入本專利權(quán)利要求書涵蓋范圍的具體實(shí)施方案,均在本專利的保護(hù)范圍之內(nèi)。