醫(yī)療設(shè)備使用的軟件代碼比以往任何時(shí)候都多。然而,雖然軟件為醫(yī)療設(shè)備提供了更多的功能和靈活性,但它也帶來(lái)了額外的復(fù)雜性,從而增加了故障風(fēng)險(xiǎn)。今天大約 20% 的醫(yī)療設(shè)備召回是由軟件缺陷引起的,而且這個(gè)數(shù)字還在上升。
聯(lián)邦藥物管理局 (FDA) 監(jiān)督在美國(guó)銷售的醫(yī)療器械的質(zhì)量,希望發(fā)布醫(yī)療器械的公司必須獲得 FDA 510(k) 許可。在調(diào)查上市后失敗的同時(shí),F(xiàn)DA 更加注重預(yù)防,并建議將靜態(tài)代碼分析作為方法的一部分。
復(fù)雜缺陷檢測(cè)的價(jià)值
現(xiàn)代靜態(tài)代碼分析工具使用復(fù)雜的技術(shù)來(lái)分析源代碼以檢測(cè)潛在的軟件缺陷。工具嘗試分析代碼中的所有邏輯路徑,提供比傳統(tǒng)測(cè)試形式更多的路徑和代碼覆蓋率。靜態(tài)分析工具不需要任何測(cè)試用例,甚至可以對(duì)代碼片段進(jìn)行操作,發(fā)現(xiàn)潛在的程序崩潰、緩沖區(qū)溢出、內(nèi)存泄漏、數(shù)據(jù)損壞等。靜態(tài)分析通常運(yùn)行迅速,并且可以在相對(duì)較短的時(shí)間內(nèi)報(bào)告一系列潛在的錯(cuò)誤(參見(jiàn)圖 1)。
圖 1:靜態(tài)分析可以在軟件開(kāi)發(fā)生命周期的早期發(fā)現(xiàn)潛在問(wèn)題。
由于各種原因,靜態(tài)分析工具確實(shí)會(huì)產(chǎn)生一些錯(cuò)誤的結(jié)果,通常稱為誤報(bào)和誤報(bào)。當(dāng)靜態(tài)分析工具認(rèn)為有錯(cuò)誤而沒(méi)有錯(cuò)誤時(shí),就會(huì)發(fā)生誤報(bào)。誤報(bào)是應(yīng)該報(bào)告錯(cuò)誤但沒(méi)有報(bào)告。
大多數(shù)現(xiàn)代靜態(tài)分析工具必須在可接受的精度水平和可接受的運(yùn)行時(shí)間之間找到盡可能多的好結(jié)果之間進(jìn)行微妙的權(quán)衡。換句話說(shuō),在大量誤報(bào)中發(fā)現(xiàn)每個(gè)問(wèn)題的嘈雜工具的價(jià)值可能有限,就像只發(fā)現(xiàn)一小部分問(wèn)題的高度準(zhǔn)確的工具一樣(參見(jiàn)圖 2)。
圖 2:靜態(tài)分析工具不會(huì)發(fā)現(xiàn)所有錯(cuò)誤(誤報(bào)),并且會(huì)報(bào)告一些并非真正的錯(cuò)誤(誤報(bào))。使遺漏的錯(cuò)誤和錯(cuò)誤報(bào)告最小化的是良好的分析算法和適當(dāng)?shù)姆治稣{(diào)整。
現(xiàn)代靜態(tài)分析工具已經(jīng)改進(jìn)了分析技術(shù),可以以足夠的準(zhǔn)確度生成有用的結(jié)果。大多數(shù)組織認(rèn)識(shí)到靜態(tài)分析工具雖然不完善,但在大多數(shù)軟件開(kāi)發(fā)過(guò)程中都提供了重要的價(jià)值。
充分利用靜態(tài)分析工具
現(xiàn)代靜態(tài)分析工具對(duì)大多數(shù)醫(yī)療設(shè)備制造商來(lái)說(shuō)都是相對(duì)較新的。對(duì)于許多首次在其流程中實(shí)施靜態(tài)分析的組織而言,了解最佳實(shí)踐有助于在最短的時(shí)間內(nèi)以最少的返工量充分利用工具。
調(diào)音
靜態(tài)分析工具提供了適用于所有類型代碼庫(kù)的通用設(shè)置,雖然它們可以立即發(fā)現(xiàn)好的錯(cuò)誤,但只需針對(duì)代碼調(diào)整工具就可以大大改善結(jié)果(參見(jiàn)圖 3)。這有助于找到更多相關(guān)的錯(cuò)誤并減少通過(guò)誤報(bào)進(jìn)行的搜索,這會(huì)浪費(fèi)時(shí)間并導(dǎo)致開(kāi)發(fā)人員疲勞。
圖 3:幾乎每個(gè)靜態(tài)分析部署都應(yīng)該從一個(gè)可靠的調(diào)優(yōu)項(xiàng)目開(kāi)始。調(diào)整會(huì)帶來(lái)更多更好的錯(cuò)誤和更少的誤報(bào)。
許多靜態(tài)分析工具都有自己的源代碼解析器,它們可能無(wú)法理解或無(wú)法訪問(wèn)所有代碼。將系統(tǒng)配置為分析所有代碼或調(diào)整系統(tǒng)以識(shí)別分析時(shí)無(wú)法訪問(wèn)的接口——例如單獨(dú)驗(yàn)證的第三方庫(kù)——確保結(jié)果是最佳和可重復(fù)的。實(shí)現(xiàn) 100% 的代碼覆蓋率對(duì)于堵住可能增加風(fēng)險(xiǎn)的漏洞非常重要。
調(diào)優(yōu)有助于發(fā)現(xiàn)真正的問(wèn)題。例如,告訴靜態(tài)分析工具內(nèi)存分配機(jī)制是如何工作的,或者程序何時(shí)退出,這樣工具就不會(huì)繼續(xù)沿著特定路徑跟蹤問(wèn)題,這有助于發(fā)現(xiàn)新問(wèn)題并剔除錯(cuò)誤問(wèn)題。這可能是一個(gè)繁瑣的過(guò)程,需要特定的專業(yè)知識(shí),但從長(zhǎng)遠(yuǎn)來(lái)看會(huì)有所回報(bào)。
調(diào)優(yōu)通常是一個(gè)持續(xù)的過(guò)程,應(yīng)定期審查,以確保一致地使用配置并跟上代碼和環(huán)境的變化。如果不進(jìn)行持續(xù)調(diào)整,開(kāi)發(fā)人員可能會(huì)錯(cuò)過(guò)一些重要的錯(cuò)誤,并且團(tuán)隊(duì)將浪費(fèi)時(shí)間檢查誤報(bào)。
配置檢查器
許多靜態(tài)分析工具附帶數(shù)百個(gè)檢查,涵蓋從并發(fā)性到安全性到 C 和 C++ 陷阱的一系列問(wèn)題。許多人不一定適用于給定的應(yīng)用程序。例如,為什么在分析 C 代碼時(shí)打開(kāi) C++ 特定檢查?確定正確的檢查器集需要一些試驗(yàn)和錯(cuò)誤以及專業(yè)知識(shí),以了解什么是最劃算的。需要考慮的一些領(lǐng)域是:哪些類型的檢查器會(huì)導(dǎo)致真正的問(wèn)題,哪些檢查器容易產(chǎn)生噪音,哪些檢查器可以配置為有用。一旦一個(gè)好的集合最終確定,將其鎖定,以便記錄并始終如一地運(yùn)行。
在一個(gè)說(shuō)明檢查器價(jià)值的真實(shí)示例中,客戶希望確保他們的靜態(tài)分析系統(tǒng)始終如一地運(yùn)行,并要求在系統(tǒng)出現(xiàn)差異時(shí)立即收到警報(bào)。開(kāi)發(fā)人員創(chuàng)建了一個(gè)測(cè)試套件,其中包含每個(gè)檢查器的測(cè)試用例。每當(dāng)他們更改系統(tǒng)時(shí),他們都會(huì)運(yùn)行測(cè)試套件以確保每個(gè)檢查器確實(shí)按預(yù)期運(yùn)行。如果結(jié)果失敗,他們知道他們有需要解決的配置問(wèn)題。如果測(cè)試通過(guò),開(kāi)發(fā)人員會(huì)將結(jié)果放入他們的設(shè)計(jì)歷史文件中,以證明系統(tǒng)按照他們記錄的方式工作。該測(cè)試套件不僅為客戶提供了責(zé)任和保證,而且還降低了他們的維護(hù)和管理成本。
過(guò)程
一旦實(shí)現(xiàn)了全面覆蓋、調(diào)整了系統(tǒng)并定義了分析的廣度,開(kāi)發(fā)人員就可以開(kāi)始更有效地使用靜態(tài)分析。對(duì)于醫(yī)療設(shè)備,一個(gè)典型的目標(biāo)是檢查報(bào)告的每一個(gè)問(wèn)題。每個(gè)問(wèn)題都可以通過(guò)多種不同的方式進(jìn)行分類:
一個(gè)必須解決的問(wèn)題。它將有一個(gè)適當(dāng)?shù)膬?yōu)先級(jí)來(lái)描述它的重要性以及在軟件開(kāi)發(fā)過(guò)程中必須如何解決它。
正確標(biāo)記的問(wèn)題,但不太可能表現(xiàn)為現(xiàn)實(shí)世界的錯(cuò)誤,通常是因?yàn)樵摴ぞ咦龀隽瞬徽_的環(huán)境假設(shè)。這些類型的分類標(biāo)志著潛在的調(diào)整機(jī)會(huì)。
被錯(cuò)誤地標(biāo)記為錯(cuò)誤的問(wèn)題,無(wú)論是誤報(bào)還是分析工具中的徹底錯(cuò)誤。這些問(wèn)題也預(yù)示著調(diào)整機(jī)會(huì)。
這些案例中的每一個(gè)都必須仔細(xì)審查。尤其應(yīng)檢查誤報(bào)的正確性。每個(gè)問(wèn)題都需要自由文檔,并且需要一個(gè)強(qiáng)大的數(shù)據(jù)保留政策來(lái)實(shí)現(xiàn)全面問(wèn)責(zé)。如果在流程后期發(fā)現(xiàn)重大錯(cuò)誤,這些分類缺陷報(bào)告可能會(huì)在審計(jì)過(guò)程中或在回顧中重新審查。組織通常會(huì)回到靜態(tài)分析缺陷以查看主要錯(cuò)誤是如何通過(guò)該過(guò)程的。它可能標(biāo)志著一個(gè)中斷的過(guò)程或一個(gè)調(diào)整分析以找到更好的錯(cuò)誤的機(jī)會(huì)。
使用模式
靜態(tài)分析通常在開(kāi)發(fā)人員沙箱構(gòu)建中和/或通過(guò)中央構(gòu)建運(yùn)行(參見(jiàn)圖 4)。至少,在發(fā)布之前分析和評(píng)估結(jié)果是有意義的。但是,軟件開(kāi)發(fā)組織不應(yīng)該等到最后一刻才解決可能存在的大量錯(cuò)誤,特別是當(dāng)這些錯(cuò)誤本可以作為規(guī)范流程的一部分更早地解決時(shí)。否則,團(tuán)隊(duì)可能會(huì)錯(cuò)過(guò)最后期限并在最壞的時(shí)間更改代碼。
圖 4:靜態(tài)分析可以根據(jù)業(yè)務(wù)需求、環(huán)境和使用的工具以多種不同方式部署。
組織通常將靜態(tài)分析自動(dòng)化作為夜間構(gòu)建或持續(xù)集成構(gòu)建的一部分。通過(guò)這種方式,可以經(jīng)常審查結(jié)果并在結(jié)果出現(xiàn)時(shí)加以處理。其他人則通過(guò)使開(kāi)發(fā)人員能夠在沙盒環(huán)境中分析他們正在處理的代碼來(lái)更早地執(zhí)行錯(cuò)誤發(fā)現(xiàn)過(guò)程。開(kāi)發(fā)人員可以立即獲得有關(guān)其代碼更改質(zhì)量的反饋,然后在簽入前修復(fù)和驗(yàn)證缺陷。循環(huán)時(shí)間越快,代碼庫(kù)中的代碼就越干凈。
無(wú)論在哪里運(yùn)行,技術(shù)環(huán)境都需要保持一致,以確保結(jié)果相同。中央和開(kāi)發(fā)人員構(gòu)建需要保持一致。對(duì)分析設(shè)置的輕微更改可能會(huì)導(dǎo)致報(bào)告更多結(jié)果,并且組織不需要審查更多可能主要是誤報(bào)的問(wèn)題的額外負(fù)擔(dān)。為開(kāi)發(fā)人員創(chuàng)建一個(gè)高度自動(dòng)化的系統(tǒng)將有助于確保一致性。
許多醫(yī)療設(shè)備公司不僅將源代碼檢查到其存儲(chǔ)庫(kù)中,還檢查其實(shí)際環(huán)境。這樣,可追溯性是可用的。靜態(tài)分析可執(zhí)行文件和所有相關(guān)配置、狀態(tài)和其他相關(guān)項(xiàng)目也應(yīng)定期檢查,以確保一致性和問(wèn)責(zé)制。
處理積壓
大多數(shù)組織在開(kāi)發(fā)大量代碼后開(kāi)始使用靜態(tài)分析。通常,代碼越多,報(bào)告的錯(cuò)誤就越多。因此,在推出靜態(tài)分析時(shí),管理層必須預(yù)先分配時(shí)間來(lái)處理最初積壓的錯(cuò)誤。
最好在開(kāi)發(fā)周期中盡早進(jìn)行靜態(tài)分析,以盡量減少積壓,然后創(chuàng)建一個(gè)流程來(lái)處理積壓,與由于日常代碼更改導(dǎo)致的日常流入錯(cuò)誤流分開(kāi)處理。審查缺陷需要時(shí)間,應(yīng)該在開(kāi)發(fā)人員之間適當(dāng)分配,或者外包給一個(gè)單獨(dú)的團(tuán)隊(duì)來(lái)挑選需要工作的缺陷。
文化
所有開(kāi)發(fā)團(tuán)隊(duì)在技術(shù)技能水平以及團(tuán)隊(duì)中每個(gè)人如何定義質(zhì)量方面都存在差異。在培訓(xùn)和指導(dǎo)課程中,最常見(jiàn)的論點(diǎn)是:
“是的,這絕對(duì)是一個(gè)錯(cuò)誤,但代碼一直在工作,所以我們不想更改它?!?/p>
“我們不應(yīng)該讓這樣的代碼出現(xiàn)在我們的產(chǎn)品中。”
“這種情況在現(xiàn)實(shí)生活中永遠(yuǎn)不會(huì)發(fā)生。”
“如果我們將來(lái)將產(chǎn)品移植到另一個(gè)平臺(tái),這將成為一個(gè)錯(cuò)誤。”
“如果你在這上面多花幾分鐘,你就會(huì)發(fā)現(xiàn)這顯然是一個(gè)錯(cuò)誤?!?/p>
靜態(tài)分析將提供各種類型的錯(cuò)誤,從必須解決的關(guān)鍵問(wèn)題到警告。一些組織希望投機(jī)取巧,只為可證明的錯(cuò)誤更改代碼。其他人則主動(dòng)清理代碼并提高質(zhì)量,甚至“修復(fù)”警告。團(tuán)隊(duì)?wèi)?yīng)該在處理靜態(tài)分析結(jié)果的方式上保持一致。審查結(jié)果、培訓(xùn)/指導(dǎo)和頻繁的溝通是成功的關(guān)鍵。
如果使用得當(dāng),靜態(tài)分析已被證明在提高安全關(guān)鍵代碼的軟件質(zhì)量方面非常有效。盡管不嚴(yán)格要求批準(zhǔn),但 FDA 承認(rèn)其有效性。通過(guò)適當(dāng)?shù)囊?guī)劃、專業(yè)知識(shí)和現(xiàn)實(shí)的投資,靜態(tài)分析應(yīng)該會(huì)產(chǎn)生可觀的投資回報(bào),并有助于向市場(chǎng)提供安全的代碼。
審核編輯:郭婷
-
醫(yī)療
+關(guān)注
關(guān)注
8文章
1824瀏覽量
58797 -
C++
+關(guān)注
關(guān)注
22文章
2110瀏覽量
73688 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68694
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論