V797. The function is used as if it returned a bool type. The return value of the function should probably be compared with std::string::npos.

The analyzer has detected an error that occurs when searching for substrings or characters in a string.

Consider the following example:

std::string s = foo();
if (s.find("42")) { .... }

The 'std::string::find' function returns a value of type 'std::string::size_type'. If no such value has been found, 'std::string::npos' is returned, which is equal to '(size_t)-1'. Therefore, if you want to check for a substring, you need to write the following code:

if (s.find("42") != std::string::npos) { .... }

Even though the code 'if (s.find(...))' is compilable and functional, its logic is very suspicious. This code checks if the required substring is absent or is not the beginning of string 's'. If you really need such behavior, it is better to implement it explicitly:

const auto pos = s.find("42");
if (pos == std::string::npos || pos != 0) { .... }

You can also use the function 'boost::starts_with' or a function that does the same check.

According to Common Weakness Enumeration, potential errors found by using this diagnostic are classified as CWE-253.

You can look at examples of errors detected by the V797 diagnostic.

Bugs Found

Checked Projects
Collected Errors
12 970