雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊:

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

這個 Bug 是來自于 CoreCLR 源代碼。

錯誤代碼:

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ù)字做比較,因為這些函數(shù)的返回值只保證大于 0 或者小于 0(譯注:而并不保證大于0就等于1,小于0就等于-1)。

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

正確的代碼:

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

建議:

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對我們的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

上一篇:通過GDB學(xué)習(xí)C語言的講解

欄    目:C語言

下一篇:C語言尋找無向圖兩點間的最短路徑

本文標(biāo)題:C++小知識:大于0并不意味著等于1

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/507.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有