大于零的数值是否等同于1?
- 内容介绍
- 文章标签
- 相关推荐
本文共计717个文字,预计阅读时间需要3分钟。
注意:本文所指出的错误示例实际上非常简单,任何C++初学者都能理解。但这种错误类型非常常见,许多严谨的代码中也可能存在这样的错误。这个Bug源于CoreCLR源代码。
错误示例:cppint main() { int a=10; int b=20; if (a==b) { cout << 相等 < 注:本文所指出的错误例子其实非常简单,任何 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)。
上面那段错误的代码可能在很长时间内都能正常工作。不过那仅仅是因为运气好而已,没什么其他原因。
本文共计717个文字,预计阅读时间需要3分钟。
注意:本文所指出的错误示例实际上非常简单,任何C++初学者都能理解。但这种错误类型非常常见,许多严谨的代码中也可能存在这样的错误。这个Bug源于CoreCLR源代码。
错误示例:cppint main() { int a=10; int b=20; if (a==b) { cout << 相等 < 注:本文所指出的错误例子其实非常简单,任何 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)。
上面那段错误的代码可能在很长时间内都能正常工作。不过那仅仅是因为运气好而已,没什么其他原因。

