C++小知识:大于0并不意味着等于1
2019-01-18 00:02
851 查看
注:本文所指出的错误例子其实非常简单,任何 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 ”来替换。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接
您可能感兴趣的文章:
相关文章推荐
- c++ 分数运算加减乘除大于小于等于显示类以及测试
- c++ 分数运算加减乘除大于小于等于显示类以及测试
- [shell] if else以及大于、小于、等于逻辑表达式 [转]
- 【小程序报错】 TLS 版本必须大于等于 1.2
- ANY 和 IN 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列
- ibatis 动态SQL like 的写法和 大于小于不等于的写法
- ibatis的sql配置文件sql.xml大于小于等于的写法
- C++小知识3
- 一个有序数组中找出两个数,使得两个数的和等于X的C++实现源代码
- 最接近且大于等于某个正整数的2的整数次幂
- 一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
- C++小知识(五)——Cairo在windows+vs2013编译
- [C/C++]在头文件中使用static定义变量意味着什么
- 华为机试—删除连续出现大于等于3的数字
- 华为机试题:输入一组大于等于0的整数,从小到大排序输出,输出有连续数时,只输出连续数的最小和最大值
- 华为机试—删除连续出现大于等于3的数字
- 索引(从零开始)必须大于或等于零,且小于参数列表的大小的错位问题
- webview在compileSdkVersion 大于等于23 android6.0以上系统执行js代码异常,但是在compileSdkVersion小于23 android6.0以下系统却执行正常问题
- 有序数组长度为N 元素出现的长度为 大于等于 N 除 4 的最小的数
- C/C++小知识总结