国产探花免费观看_亚洲丰满少妇自慰呻吟_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 ”來替換。

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐陵市| 饶阳县| 句容市| 酒泉市| 罗田县| 无为县| 福清市| 抚顺县| 凤翔县| 南康市| 泾阳县| 鸡西市| 松桃| 安顺市| 鹤岗市| 西林县| 马尔康县| 资兴市| 衡山县| 涟水县| 辉县市| 五华县| 土默特右旗| 巴马| 临高县| 吉水县| 滦南县| 建阳市| 临湘市| 诸城市| 根河市| 赤峰市| 霍林郭勒市| 黑龙江省| 怀柔区| 张家界市| 马龙县| 遵义县| 大足县| 武安市| 连山|