翻譯|行業(yè)資訊|編輯:鄭恭琳|2020-05-22 17:17:05.933|閱讀 246 次
概述:編碼標(biāo)準(zhǔn)是良好軟件工程實(shí)踐的組成部分,使我們從“構(gòu)建、失敗、修復(fù)”周期轉(zhuǎn)變?yōu)榫哂懈哔|(zhì)量、安全性和安全性的“設(shè)計(jì)、構(gòu)建、交付”周期。本文將討論: 這些標(biāo)準(zhǔn)如何幫助我們從發(fā)現(xiàn)缺陷轉(zhuǎn)變?yōu)闃?gòu)建功能更強(qiáng)大的軟件。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
軟件從臺(tái)式機(jī)遷移到我們接觸的幾乎所有事物。從智能恒溫器到輸液泵再到汽車,軟件無處不在且在不斷發(fā)展。物聯(lián)網(wǎng)(IoT)中的所謂“事物”越來越多地帶有更多邏輯。有了它,更大的失敗風(fēng)險(xiǎn)。這些設(shè)備中的許多設(shè)備都被用于醫(yī)療和汽車等對(duì)安全至關(guān)重要的領(lǐng)域,有可能造成人身傷害。
大多數(shù)構(gòu)建設(shè)備的公司都正確地將當(dāng)前的軟件開發(fā)視為一群瘋狂的牛仔和混亂者,但是有希望。可以并且必須將軟件視為工程實(shí)踐。編碼標(biāo)準(zhǔn)是良好軟件工程實(shí)踐的組成部分,使我們從“構(gòu)建、失敗、修復(fù)”周期轉(zhuǎn)變?yōu)榫哂懈哔|(zhì)量、安全性和安全性的“設(shè)計(jì)、構(gòu)建、交付”周期。
事實(shí)證明,這些相同的標(biāo)準(zhǔn)還在網(wǎng)絡(luò)安全領(lǐng)域提供了雙重職責(zé)。這篇文章討論:
軟件對(duì)現(xiàn)實(shí)世界的影響通常是低估的。作為Parasoft的傳播者,我不斷討論的主要主題之一是軟件開發(fā)確實(shí)應(yīng)該是工程設(shè)計(jì)。
我們經(jīng)常由軟件工程師來稱呼軟件開發(fā)人員,但這不一定是他們今天工作方式的恰當(dāng)術(shù)語。演變?yōu)榱己玫能浖こ虒?shí)踐會(huì)導(dǎo)致成本下降和質(zhì)量上升。其中的關(guān)鍵部分是采用標(biāo)準(zhǔn),尤其是編碼標(biāo)準(zhǔn)。
互聯(lián)汽車、物聯(lián)網(wǎng)和永久互聯(lián)設(shè)備的時(shí)代在這里。軟件正在滲透到我們從未想到的產(chǎn)品、設(shè)備和其他地方。現(xiàn)在,我們必須認(rèn)真考慮這些產(chǎn)品中的軟件及其后果。
我嘗試解釋的有趣的事情之一是,構(gòu)建良好的軟件與構(gòu)建汽車之類的東西不同。如果我要制造高質(zhì)量的汽車,我必須花更多的材料和更多的時(shí)間來制造它。事實(shí)證明,在軟件中,您無需花費(fèi)更多的時(shí)間來構(gòu)建高質(zhì)量的軟件。您花更多的錢來構(gòu)建質(zhì)量差的軟件。
我們必須了解,在軟件中,大多數(shù)缺陷來自程序員,后者將它們放入產(chǎn)品中。如果我們?cè)陂_發(fā)軟件時(shí)能夠停止引入缺陷,那么我們可以以更低的價(jià)格獲得更好的軟件。
這句話引自Edsger W Dijkstra在1972年的一次演講,名為“謙虛的程序員”。今天仍然非常重要。
重要的是要意識(shí)到質(zhì)量如何影響軟件開發(fā)成本。研究人員Capers Jones已經(jīng)關(guān)注了數(shù)十年,并每年進(jìn)行一次軟件成本調(diào)查。這些數(shù)字每年變化不大。數(shù)據(jù)顯示,從需求到編碼再到維護(hù)的每個(gè)階段,軟件的典型成本都會(huì)增加。但是,團(tuán)隊(duì)對(duì)待質(zhì)量的方式?jīng)Q定了他們的過程是健康的還是“病態(tài)的”。
有道理的是,如果我們?cè)诰帉懘a時(shí)就發(fā)現(xiàn)缺陷,那么成本就相對(duì)便宜了——例如,開發(fā)人員只需幾分鐘的時(shí)間。如果可以在開發(fā)階段消除85%的缺陷,那么對(duì)成本的影響就很大。考慮一下現(xiàn)在著名的Capers Jones圖表,它顯示了在每個(gè)開發(fā)階段修復(fù)缺陷的平均成本:
根據(jù)對(duì)使用真實(shí)軟件而不是理論模型的真實(shí)公司的研究,修復(fù)發(fā)布后的缺陷大約需要16000美元(可能更多)。如果我們查看周期后期的質(zhì)量和安全性工作(例如滲透測(cè)試),則此處發(fā)現(xiàn)的安全性問題處于周期的昂貴末端。通過測(cè)試與早期安全審核相比,查找漏洞的成本可能高出15倍。
一種過時(shí)且可證明是錯(cuò)誤的方法是通過在生命周期的結(jié)尾(即發(fā)行前)進(jìn)行測(cè)試來提高軟件的質(zhì)量。在制造業(yè)中,他們知道這是不可能的,但是出于某些原因,我們認(rèn)為我們可以測(cè)試“進(jìn)入”軟件的質(zhì)量(和安全性)。
我之所以說軟件開發(fā)幾乎絕不是工程學(xué),是因?yàn)楫?dāng)前軟件開發(fā)具有以下共同特征:
軟件編碼標(biāo)準(zhǔn)的目標(biāo)是灌輸經(jīng)過驗(yàn)證的編程實(shí)踐,以產(chǎn)生安全,可靠,可測(cè)試和可維護(hù)的代碼。通常,這意味著避免使用已知的不安全編碼做法或可能導(dǎo)致不可預(yù)測(cè)行為的代碼。這對(duì)于像C和C++這樣的編程語言至關(guān)重要,因?yàn)樵谶@些語言中,編寫不安全或不安全代碼的可能性很高。
但是,我認(rèn)為行業(yè)在使用這些編程標(biāo)準(zhǔn)時(shí)已迷失了方向。在過去的十年中,這些工具(例如靜態(tài)分析工具)已經(jīng)從檢測(cè)不安全的潛在問題代碼或已知的語言弱點(diǎn)轉(zhuǎn)變?yōu)橐栽缙跍y(cè)試的形式尋找缺陷,也稱為左移。
盡管尋找缺陷很重要,但是開發(fā)完善的軟件是一項(xiàng)更具生產(chǎn)力的活動(dòng)。我們應(yīng)該做的是建立和執(zhí)行標(biāo)準(zhǔn),以避免出現(xiàn)缺陷首先出現(xiàn)的情況,即向左移動(dòng)更遠(yuǎn)。
作為支持,請(qǐng)考慮軟件工程研究所(SEI)所做的研究,他們毫不奇怪地發(fā)現(xiàn),安全性和可靠性是緊密相連的,并且可以通過發(fā)現(xiàn)的質(zhì)量缺陷的數(shù)量和類型來預(yù)測(cè)軟件的安全性。此外,關(guān)鍵缺陷通常是編碼錯(cuò)誤,可以通過檢查和工具(例如靜態(tài)分析)來避免。
行業(yè)標(biāo)準(zhǔn)
這篇文章沒有詳細(xì)介紹每種編碼標(biāo)準(zhǔn),但是在以下行業(yè)標(biāo)準(zhǔn)中有大量工作要做。盡管它們的應(yīng)用可能特定于特定類型,但這些標(biāo)準(zhǔn)已在許多行業(yè)中得到采用。以下是一些已建立的安全性編碼標(biāo)準(zhǔn)示例。
讓我們考慮一下MISRA C,我提到的它不僅是用于汽車應(yīng)用。但是,該標(biāo)準(zhǔn)自1998年以來一直在使用,并且定義明確。他們每?jī)赡赀M(jìn)行一次更新。隨著C和C++語言的發(fā)展,它們圍繞著它發(fā)展了標(biāo)準(zhǔn)。這是一個(gè)非常靈活的標(biāo)準(zhǔn),其中考慮了不同的嚴(yán)重性級(jí)別,并且有成文的策略來處理和記錄偏差。
作為可以檢測(cè)違反編碼標(biāo)準(zhǔn)準(zhǔn)則的技術(shù)(例如靜態(tài)分析),MISRA的最新版本考慮了哪些準(zhǔn)則是可以確定的(可以用工具高精度地檢測(cè)到),而哪些不是。這使我們想到了采用和強(qiáng)制執(zhí)行以及靜態(tài)分析工具在編碼標(biāo)準(zhǔn)中的重要性。
靜態(tài)分析的作用
研究表明,缺陷清除不足是軟件質(zhì)量低下的主要原因。程序員發(fā)現(xiàn)自己軟件中的缺陷的效率約為35%。在開發(fā)周期的后期,在所有設(shè)計(jì)評(píng)審、同行評(píng)審、單元測(cè)試和功能測(cè)試之后,我們希望消除的大多數(shù)缺陷約為75%。
如果在預(yù)防模式下正確使用靜態(tài)分析,則可以將缺陷清除率提高到大約85%。但是,當(dāng)今大多數(shù)組織使用靜態(tài)分析的重點(diǎn)是檢測(cè)和快速修復(fù)。
首先使用靜態(tài)分析工具來防止已知的不良編程習(xí)慣和語言功能,可能會(huì)帶來進(jìn)一步的好處。在這里,編碼標(biāo)準(zhǔn)將作為指導(dǎo)原則和編程語言子集發(fā)揮作用,以防止將諸如緩沖區(qū)溢出或缺少初始化之類的常見缺陷寫入代碼中。
只需一點(diǎn)預(yù)防
考慮一個(gè)示例,在該示例中,可能使用動(dòng)態(tài)應(yīng)用程序安全工具(DAST)檢測(cè)到一個(gè)相當(dāng)復(fù)雜的緩沖區(qū)溢出錯(cuò)誤。運(yùn)氣不好,因?yàn)槟臏y(cè)試剛好執(zhí)行了包含錯(cuò)誤的代碼路徑。一旦被檢測(cè)和調(diào)試,就需要重新測(cè)試等等。使用流分析的靜態(tài)分析可能也發(fā)現(xiàn)了此錯(cuò)誤,但這取決于應(yīng)用程序的復(fù)雜性。
運(yùn)行時(shí)錯(cuò)誤檢測(cè)非常精確,但是它僅檢查您執(zhí)行的代碼行。因此,它僅與測(cè)試代碼覆蓋率一樣好。考慮一下編碼標(biāo)準(zhǔn)是否首先禁止了導(dǎo)致此錯(cuò)誤的代碼。
像MISRA C這樣的編碼標(biāo)準(zhǔn)并沒有描述例如如何檢測(cè)未初始化的內(nèi)存,而是指導(dǎo)程序員編寫首先不會(huì)導(dǎo)致這種錯(cuò)誤的代碼。我相信這更多是一種工程方法:根據(jù)眾所周知的公認(rèn)標(biāo)準(zhǔn)進(jìn)行編程。以土木工程和建筑橋梁為例。
我們不會(huì)采取建造橋梁的方法,而是先通過越來越大的卡車來測(cè)試它,直到它倒塌,再測(cè)量最后一輛成功使用的卡車的重量,然后再次建造以承受新的重量。這種方法還是很愚蠢的,與我們進(jìn)行軟件開發(fā)的方法沒有什么不同。
一旦軟件團(tuán)隊(duì)采用編碼標(biāo)準(zhǔn)并正確應(yīng)用了靜態(tài)分析,他們就可以及早發(fā)現(xiàn)錯(cuò)誤并加以預(yù)防。換句話說,團(tuán)隊(duì)正在改變編寫代碼的方式,這更好,而不是盡早發(fā)現(xiàn)缺陷,這是好的!
考慮Heartbleed漏洞。現(xiàn)在有針對(duì)此特定漏洞實(shí)例的檢測(cè)器,但有一種方法可以編寫代碼,從而使Heartbleed永遠(yuǎn)不會(huì)發(fā)生。預(yù)防是一種更好、更安全的方法。
Dykstra說:“那些想要真正可靠軟件的人會(huì)發(fā)現(xiàn),他們必須找到避免大多數(shù)bug的方法。”擁有可靠的預(yù)防方法比修復(fù)這些錯(cuò)誤的成本要少。
編碼標(biāo)準(zhǔn)體現(xiàn)了以其相應(yīng)語言進(jìn)行編程的合理的工程原理,并構(gòu)成了任何預(yù)防方法的基礎(chǔ)。好的軟件的成本小于劣質(zhì)的軟件的成本。如果您今天不使用靜態(tài)分析,或者僅將其用于早期檢測(cè),請(qǐng)查看Parasoft的C和C++,Java,C#和VB.NET靜態(tài)分析工具,其中包含豐富的檢查程序庫內(nèi)置了流行的安全標(biāo)準(zhǔn)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn