C++小知識(shí):大于0并不意味著等于1
注:本文所指出的錯(cuò)誤例子其實(shí)非常簡單,任何 C++ 的初學(xué)者都能看懂。但是這個(gè)錯(cuò)誤也非常典型,估計(jì)很多非常嚴(yán)肅的代碼里面都存在這樣的錯(cuò)誤。
這個(gè) Bug 是來自于 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ò)誤的代碼可能在很長時(shí)間內(nèi)都能正常工作。不過那僅僅是因?yàn)檫\(yùn)氣好而已,沒什么其他原因。某一天你寫的函數(shù)很可能突然間就崩潰了 —— 比如,你換了一個(gè)編譯器編譯源代碼,或者通過其他方式優(yōu)化了 memcpy() 函數(shù)。然后你的代碼就不能正常工作了。
正確的代碼:
bool operator( )(const GUID& _Key1, const GUID& _Key2) const
{ return memcmp(&_Key1, &_Key2, sizeof(GUID)) < 0; }
建議:
不要依賴函數(shù)本身的行為。如果文檔上說一個(gè)函數(shù)能返回一個(gè)不等于 0 的值,那它就是這么實(shí)現(xiàn)的。也就是說這個(gè)函數(shù)可能返回 -10、2 或者 1024。你可能經(jīng)??吹胶瘮?shù)的返回值就是 -1、0 或者 1,但是這并不能保證它每次都會(huì)這么做。
這個(gè)錯(cuò)誤是通過 PSV-Studio 靜態(tài)分析工具掃描分析得到的。錯(cuò)誤文本如下:V698 表達(dá)式 “memcmp(…) == -1“ 是不正確的。這個(gè)函數(shù)可能的返回值不一定只有“-1”,而可能是任何負(fù)數(shù)。請考慮到使用 “memcmp(…) < 0 ”來替換。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- C++實(shí)踐排序函數(shù)模板項(xiàng)目的參考方法
- C++二維數(shù)組中數(shù)組元素存儲(chǔ)地址的計(jì)算疑問講解
- 劍指offer之C++語言實(shí)現(xiàn)鏈表(兩種刪除節(jié)點(diǎn)方式)
- Android Java調(diào)用自己C++類庫的實(shí)例講解
- Python使用ctypes調(diào)用C/C++的方法
- C++小知識(shí):盡可能使用枚舉類
- C++小知識(shí):用++i替代i++
- C++小知識(shí):用合適的工具來分析你的代碼
- C++小知識(shí):不要去做編譯器的工作
- C++實(shí)踐分?jǐn)?shù)類中運(yùn)算符重載的方法參考
相關(guān)文章
C++面試八股文之STL標(biāo)準(zhǔn)模板庫使用詳解
這篇文章主要為大家介紹了C++面試八股文之STL標(biāo)準(zhǔn)模板庫使用詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
C++ 動(dòng)態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])
這篇文章主要介紹了C++ 動(dòng)態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[]),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
詳解C++中const_cast與reinterpret_cast運(yùn)算符的用法
這篇文章主要介紹了C++中const_cast與reinterpret_cast運(yùn)算符的用法,經(jīng)常被用于表達(dá)式中的類型轉(zhuǎn)換,需要的朋友可以參考下2016-01-01
從頭學(xué)習(xí)C語言之for語句和循環(huán)嵌套
這篇文章主要為大家詳細(xì)介紹了C語言之for語句和循環(huán)嵌套,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01

