C++小知識:大于0并不意味著等于1
注:本文所指出的錯誤例子其實(shí)非常簡單,任何 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ù)字做比較,因?yàn)檫@些函數(shù)的返回值只保證大于 0 或者小于 0(譯注:而并不保證大于0就等于1,小于0就等于-1)。
上面那段錯誤的代碼可能在很長時間內(nèi)都能正常工作。不過那僅僅是因?yàn)檫\(yùn)氣好而已,沒什么其他原因。某一天你寫的函數(shù)很可能突然間就崩潰了 —— 比如,你換了一個編譯器編譯源代碼,或者通過其他方式優(yōu)化了 memcpy() 函數(shù)。然后你的代碼就不能正常工作了。
正確的代碼:
bool operator( )(const GUID& _Key1, const GUID& _Key2) const { return memcmp(&_Key1, &_Key2, sizeof(GUID)) < 0; }
建議:
不要依賴函數(shù)本身的行為。如果文檔上說一個函數(shù)能返回一個不等于 0 的值,那它就是這么實(shí)現(xiàn)的。也就是說這個函數(shù)可能返回 -10、2 或者 1024。你可能經(jīng)??吹胶瘮?shù)的返回值就是 -1、0 或者 1,但是這并不能保證它每次都會這么做。
這個錯誤是通過 PSV-Studio 靜態(tài)分析工具掃描分析得到的。錯誤文本如下:V698 表達(dá)式 “memcmp(…) == -1“ 是不正確的。這個函數(shù)可能的返回值不一定只有“-1”,而可能是任何負(fù)數(shù)。請考慮到使用 “memcmp(…) < 0 ”來替換。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
C++ 數(shù)據(jù)結(jié)構(gòu)之水洼的數(shù)量算法
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之水洼的數(shù)量算法的相關(guān)資料,需要的朋友可以參考下2017-06-06C/C++獲取當(dāng)前時間的方法總結(jié)(最全)
這篇文章主要為大家整理了C/C++中獲取當(dāng)前時間的最全方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和借鑒價值,需要的可以了解一下2023-03-03探討:程序在內(nèi)存中的分配(常量,局部變量,全局變量,程序代碼)問題
本篇文章是對程序在的內(nèi)存中分配(常量,局部變量,全局變量,程序代碼)的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++實(shí)現(xiàn)棧與分析棧的知識點(diǎn)
這篇文章主要介紹了C++實(shí)現(xiàn)棧與分析棧的知識點(diǎn),棧(stack)是計算機(jī)中常用的一種線性數(shù)據(jù)結(jié)構(gòu),經(jīng)常有資料使用“操作受限”來形容棧,因?yàn)樗膲喝霔:蛷棾鰲2僮髦荒茉跅m斶M(jìn)行,下文更多相關(guān)資料,需要的小伙伴可以參考一下2022-03-03C++11中std::declval的實(shí)現(xiàn)機(jī)制淺析
這篇文章主要給大家介紹了關(guān)于C++11中std::declval實(shí)現(xiàn)機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-07-07C++11關(guān)于auto關(guān)鍵字的使用示例
今天小編就為大家分享一篇關(guān)于C++11關(guān)于auto關(guān)鍵字的使用示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12C語言數(shù)據(jù)結(jié)構(gòu)之鏈隊列的基本操作
這篇文章主要為大家介紹了C語言之鏈隊列的基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12