时间:2021-05-20
注:本文所指出的错误例子其实非常简单,任何 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 ”来替换。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
面试结束并不意味着求职过程就完了,也不意味着求职者就可以袖手以待聘用通知的到来,有些事你还得干。一、感谢为了加深招聘人员对你的印象,增加求职成功的可能性,面试后
高考、中考结束不久,但并不意味着学生们追求知识的脚步就会停止,暑假是很多学生都会进行学习培训、选读兴趣班的时候。敬业的小编控制不住寄几好奇的内心,在度娘家搜索了
通过Instagram赚到钱的人有很多,但这并不意味着其中没有挑战。挑战1:哪里能发现联盟营销项目LeadDyno旗下的E-CommerceAffiliates
IOS中new和allocinit的对比1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[classNamealloc]init]但是并不意味着你
iphone5c停产了还能买到吗?有很多朋友问iphone5c停产后能卖多久,停产并不意味着市面上立刻买不到iPhone5c,而是需要经过一段时间,那么大概