V698. Functions of strcmp() kind can return any values, not only -1, 0, or 1.
The analyzer has detected a comparison of the result of strcmp() or similar function to 1 or -1. The C/C++ language specification, however, says that the strcmp() function can return any positive or negative value when strings are not equal – not only 1 or -1.
Depending on the implementation, the strcmp() function can return the following values when strings are not equal:
- -1 or any negative number if the first string is less than the second in the lexicographical order;
- 1 or any positive number if the first string is larger than the second.
Whether constructs like strcmp() == 1 will work right depends on libraries, the compiler and its settings, the operating system and its bitness, and so on; in this case you should always write strcmp() > 0.
For example, below is a fragment of incorrect code:
std::vector<char *> vec;
....
std::sort(vec.begin(), vec.end(), [](
const char * a, const char * b)
{
return strcmp(a, b) == 1;
});
When you change over to a different compiler, target operating system or application bitness, the code may start working improperly.
The fixed code:
std::vector<char *> vec;
....
std::sort(vec.begin(), vec.end(), [](
const char * a, const char * b)
{
return strcmp(a, b) > 0;
});
The analyzer also considers code incorrect when it compares results of two strcmp() functions. Such code is very rare but always needs examining.
This diagnostic is classified as:
|
You can look at examples of errors detected by the V698 diagnostic. |