国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

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

2020-01-26 13:34:03
字體:
來源:轉載
供稿:網友

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

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

錯誤代碼:

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

解釋:

你不能將 memcpy()、strcmp() 以及其他一些標準函數的返回值,和 1、-1 這些具體的數字做比較,因為這些函數的返回值只保證大于 0 或者小于 0(譯注:而并不保證大于0就等于1,小于0就等于-1)。

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

正確的代碼:

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

建議:

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。如果你想了解更多相關內容請查看下面相關鏈接

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博客| 巴彦县| 泸州市| 丁青县| 全南县| 昌黎县| 三江| 秀山| 襄垣县| 惠州市| 达州市| 潜江市| 炎陵县| 吉林市| 柘城县| 汕头市| 娱乐| 宁陵县| 股票| 德清县| 泌阳县| 北碚区| 公主岭市| 栾川县| 新余市| 柳林县| 宝应县| 吴江市| 永春县| 和硕县| 绥滨县| 湖北省| 青田县| 白山市| 华蓥市| 朝阳区| 日喀则市| 孟连| 景宁| 嘉荫县| 乌什县|