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.


Анализатор обнаружил ошибку при поиске подстрок или символов в строке.

Пример:

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

Функция 'std::string::find' возвращает число типа 'std::string::size_type'. В случае, когда ничего не найдено, возвращается 'std::string::npos', равный '(size_t)-1'. Соответственно, для того чтобы проверить наличие подстроки, необходимо написать следующий код:

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

Несмотря на то, что код 'if (s.find(...))' компилируется и работает, логика работы такого кода крайне подозрительна. Он проверяет, что искомая подстрока не встречается или она не является началом строки 's'. Если действительно нужно такое поведение, то лучше написать явно:

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

Также можно воспользоваться функцией 'boost::starts_with' или её аналогом.

Согласно Common Weakness Enumeration, потенциальные ошибки, найденные с помощью этой диагностики, классифицируются как CWE-253.

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V797.


Найденные ошибки

Проверено проектов
361
Собрано ошибок
13 417

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;