博客
希望我們能(néng)與您分享和探讨成(chéng)長(cháng)中的點點滴滴
什麼(me)是誤報?如何識别誤報和漏報
分享到
不管開(kāi)發(fā)人員技能(néng)多麼(me)精通,誤報和漏報總是會(huì)發(fā)生,很可能(néng)是他們的代碼有某種(zhǒng)無意的錯誤或漏洞。爲了确保盡早發(fā)現這(zhè)些編碼錯誤和漏洞,開(kāi)發(fā)人員通常使用代碼靜态分析 工具,工具會(huì)根據開(kāi)發(fā)人員設置的規則檢查代碼。
然而,代碼靜态分析工具并不完美,工具有時(shí)也會(huì)出現誤報和漏報。這(zhè)些編碼錯誤如果沒(méi)有被(bèi)捕獲,可能(néng)會(huì)對(duì)代碼産生顯著的影響。
因此,我們將(jiāng)闡釋什麼(me)是誤報,概述誤報和漏報的區别,并提供一個誤報示例和和一個漏報示例。
本文將(jiāng)包含如下幾個部分:
• 什麼(me)是誤報?
• 什麼(me)是漏報?
• 是什麼(me)導緻了誤報和漏報?
• 如何診斷誤報和漏報?
• 什麼(me)是誤報示例和什麼(me)是漏報示例?
• 如何減少誤報和漏報?
什麼(me)是誤報?
誤報是指實際上并不存在于代碼中的問題。它不需要修複。代碼沒(méi)有違反規則,但卻被(bèi)報了一個診斷問題,發(fā)生這(zhè)種(zhǒng)情況就(jiù)是誤報。
與之相反的真的問題就(jiù)是需要被(bèi)修複的。它違反了規則,實際上是一個真實的問題。
但是從誤報中篩選出真的問題是很棘手的。而漏報可能(néng)更加棘手。
什麼(me)是漏報?
漏報是指沒(méi)有被(bèi)發(fā)現的問題。違反規則,但卻沒(méi)有被(bèi)報出來,發(fā)生這(zhè)種(zhǒng)情況就(jiù)是漏報。
除此之外都(dōu)表示代碼不違反規則。
所以,找出漏報真得很棘手。您如何知道(dào)自己是否漏掉了一個缺陷呢?
是什麼(me)導緻了誤報和漏報?
誤報和漏報的主要原因有兩(liǎng)個。
工具出錯
工具并不完美,也會(huì)出錯,因此誤報和漏報是不可避免的。
這(zhè)就(jiù)是爲什麼(me)讓一個人評審您的代碼以及複核工具檢測到的任何違規是至關重要的。
例如,您可能(néng)設置一個規則,即不存在除零(DBZ)問題。然後(hòu),該工具可能(néng)會(huì)标記一段存在DBZ問題的代碼。所以,您仔細看看這(zhè)段代碼,可能(néng)會(huì)發(fā)現其實并沒(méi)有什麼(me)問題。這(zhè)隻是一個誤報。
不可判定的規則
您可能(néng)有一些無法判定的編碼規則。這(zhè)意味著(zhe)它不能(néng)以100%的準确性執行。
不可判定性是如何發(fā)生的?
當您缺乏可見性時(shí),就(jiù)會(huì)發(fā)生不可判定性。
如果您能(néng)夠充分了解程序中的所有内容,那麼(me)您就(jiù)可以判定是否違反了某個規則。您能(néng)夠從一個靜态分析工具中查看診斷結果,并知道(dào)“這(zhè)是一個誤報!”
但是,您無法了解程序中包含的所有内容。您無法訪問其他程序員爲程序的其他部分(例如,固件)所編寫的代碼。其他部分也會(huì)有輸入。因此,如果不能(néng)清晰了解所有内容,您就(jiù)無法判斷是否存在真正的問題。
如何判斷誤報和漏報?
有一些誤報和漏報是顯而易見的,清晰可辨。
但是總有一個灰色地帶。
識别誤報和漏報
對(duì)診斷的判定是主觀的,取決于您所從事(shì)的行業,以及您使用的編碼規則。
誤報各不相同
一家公司的誤報可能(néng)不會(huì)是另一家公司的誤報。
這(zhè)裡(lǐ)有一個誤報的示例。您可能(néng)正在開(kāi)發(fā)一款安裝在汽車裡(lǐ)的軟件。如果軟件出現問題,生命可能(néng)會(huì)受到威脅。因此,如果您設置一個規則,即不存在DBZ問題,而卻得到了存在DBZ問題的診斷,那麼(me)您將(jiāng)需要仔細評估每個違規行爲。
然而,您可能(néng)正在開(kāi)發(fā)用于娛樂系統的軟件。因此,您會(huì)隻想要快速排除誤報,隻會(huì)去管那些真的問題。
漏報也各不相同
同樣(yàng)地,一家公司的漏報可能(néng)不會(huì)是另一家公司的漏報。
這(zhè)裡(lǐ)有一個漏報的示例。如果您需要對(duì)您的程序進(jìn)行真正的防禦,您可能(néng)會(huì)用到CERT或MISRA編碼規則。如果一個規則沒(méi)有捕獲到某些事(shì)情發(fā)生的可能(néng)性,那麼(me)它就(jiù)是一個漏報。
但是,對(duì)于另一家公司來說(shuō),隻有當一個規則沒(méi)有捕獲到一些絕對(duì)會(huì)發(fā)生的事(shì)情,它才是一個漏報。
随著(zhe)您的可見性增強,您所認爲的誤報或漏報會(huì)得到改進(jìn)。
如何證明誤報和漏報?
您需要做多少工作來證明誤報和漏報是不同的。如果您在一個高風險的安全關鍵型行業,您需要證明它是誤報還(hái)是漏報。如果您所在的行業風險較低,您可能(néng)會(huì)查看診斷結果,排除它是誤報或漏報,然後(hòu)繼續檢查。
什麼(me)是誤報示例和什麼(me)是漏報示例?
不同的開(kāi)發(fā)人員對(duì)診斷結果有不同的闡釋。這(zhè)與他們所從事(shì)的行業以及經(jīng)驗有關。
下面(miàn)介紹三種(zhǒng)類型的開(kāi)發(fā)人員如何闡釋診斷結果。
如何減少誤報和漏報?
不幸的是,誤報和漏報是不可避免的。
誤報需要額外的檢查時(shí)間,而且可能(néng)會(huì)導緻真正的問題被(bèi)草率地排除在外。
漏報是任務關鍵型軟件開(kāi)發(fā)人員的主要顧慮。對(duì)這(zhè)些開(kāi)發(fā)人員來說(shuō),誤報勝過(guò)漏報。
并非所有的代碼檢查工具都(dōu)是一樣(yàng)的…
并非所有的代碼檢查工具(如MISRA檢查工具)都(dōu)是一樣(yàng)的。有些檢查工具的準确性更高。而有些會(huì)産生更多的誤報和漏報。
選擇針對(duì)誤報和漏報最好(hǎo)的代碼檢查工具
選擇正确的代碼分析工具可以爲您提供更好(hǎo)的診斷結果,并幫助您更好(hǎo)地識别誤報和漏報。
當您獲得正确的診斷結果時(shí),您可以減少誤報和漏報。因此,您將(jiāng)擁有安全可靠的代碼、一緻的風格以及更容易維護的代碼庫。
欲了解Perforce靜态分析工具Helix QAC和Klocwork如何幫助提高代碼質量,立刻注冊申請免費試用吧。