C++小知识:大于0并不意味着等于1
注:本文所指出的错误例子其实非常简单,任何C++的初学者都能看懂。但是这个错误也非常典型,估计很多非常严肃的代码里面都存在这样的错误。
这个Bug是来自于CoreCLR源代码。
错误代码:
booloperator()(constGUID&_Key1,constGUID&_Key2)const {returnmemcmp(&_Key1,&_Key2,sizeof(GUID))==-1;}
解释:
你不能将memcpy()、strcmp()以及其他一些标准函数的返回值,和1、-1这些具体的数字做比较,因为这些函数的返回值只保证大于0或者小于0(译注:而并不保证大于0就等于1,小于0就等于-1)。
上面那段错误的代码可能在很长时间内都能正常工作。不过那仅仅是因为运气好而已,没什么其他原因。某一天你写的函数很可能突然间就崩溃了——比如,你换了一个编译器编译源代码,或者通过其他方式优化了memcpy()函数。然后你的代码就不能正常工作了。
正确的代码:
booloperator()(constGUID&_Key1,constGUID&_Key2)const {returnmemcmp(&_Key1,&_Key2,sizeof(GUID))<0;}
建议:
不要依赖函数本身的行为。如果文档上说一个函数能返回一个不等于0的值,那它就是这么实现的。也就是说这个函数可能返回-10、2或者1024。你可能经常看到函数的返回值就是-1、0或者1,但是这并不能保证它每次都会这么做。
这个错误是通过PSV-Studio静态分析工具扫描分析得到的。错误文本如下:V698表达式“memcmp(…)==-1“是不正确的。这个函数可能的返回值不一定只有“-1”,而可能是任何负数。请考虑到使用“memcmp(…)<0”来替换。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。