C++小知識(shí):大于0并不意味著等于1

注:本文所指出的錯(cuò)誤例子其實(shí)非常簡(jiǎn)單,任何 C++ 的初學(xué)者都能看懂。但是這個(gè)錯(cuò)誤也非常典型,估計(jì)很多非常嚴(yán)肅的代碼里面都存在這樣的錯(cuò)誤。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、重慶小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了合水免費(fèi)建站歡迎大家使用!

這個(gè) Bug 是來(lái)自于 CoreCLR 源代碼。

錯(cuò)誤代碼:

bool operator( )(const GUID& _Key1, const GUID& _Key2) const
 { return memcmp(&_Key1, &_Key2, sizeof(GUID)) == -1; }

解釋:

你不能將 memcpy()、strcmp() 以及其他一些標(biāo)準(zhǔn)函數(shù)的返回值,和 1、-1 這些具體的數(shù)字做比較,因?yàn)檫@些函數(shù)的返回值只保證大于 0 或者小于 0(譯注:而并不保證大于0就等于1,小于0就等于-1)。

上面那段錯(cuò)誤的代碼可能在很長(zhǎng)時(shí)間內(nèi)都能正常工作。不過(guò)那僅僅是因?yàn)檫\(yùn)氣好而已,沒(méi)什么其他原因。某一天你寫的函數(shù)很可能突然間就崩潰了 —— 比如,你換了一個(gè)編譯器編譯源代碼,或者通過(guò)其他方式優(yōu)化了 memcpy() 函數(shù)。然后你的代碼就不能正常工作了。

正確的代碼:

bool operator( )(const GUID& _Key1, const GUID& _Key2) const
 { return memcmp(&_Key1, &_Key2, sizeof(GUID)) < 0; }

建議:

不要依賴函數(shù)本身的行為。如果文檔上說(shuō)一個(gè)函數(shù)能返回一個(gè)不等于 0 的值,那它就是這么實(shí)現(xiàn)的。也就是說(shuō)這個(gè)函數(shù)可能返回 -10、2 或者 1024。你可能經(jīng)常看到函數(shù)的返回值就是 -1、0 或者 1,但是這并不能保證它每次都會(huì)這么做。

這個(gè)錯(cuò)誤是通過(guò) PSV-Studio 靜態(tài)分析工具掃描分析得到的。錯(cuò)誤文本如下:V698 表達(dá)式 “memcmp(…) == -1“ 是不正確的。這個(gè)函數(shù)可能的返回值不一定只有“-1”,而可能是任何負(fù)數(shù)。請(qǐng)考慮到使用 “memcmp(…) < 0 ”來(lái)替換。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

當(dāng)前文章:C++小知識(shí):大于0并不意味著等于1
本文來(lái)源:http://bm7419.com/article8/pcdsip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)、服務(wù)器托管網(wǎng)站制作、App開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)