# V698. Functions of strcmp() kind can return any values, not only -1, 0, or 1.

Анализатор обнаружил в коде сравнение результата функции strcmp() или ей подобной с единицей или с минус единицей. В свою очередь, в спецификации языков C/С++ сказано, что функция strcmp() может вернуть любое положительное или любое отрицательное значение в случае неравенства строк, не только единицу или минус единицу.

В зависимости от реализации, функция strcmp() может в результате неравенства строк возвращать:

- -1 или любое отрицательное число, если первая строка меньше второй в лексикографическом порядке;
- 1 или любое положительное число, если первая строка больше второй.

Работоспособность конструкций вида strcmp() == 1 зависит от библиотек, компилятора, его настроек, операционной системы, её разрядности и так далее; требуется всегда в таком случае писать strcmp() > 0.

В качестве примера можно привести следующий некорректный код:

    std::vector<char *> vec;
    ....
    std::sort(vec.begin(), vec.end(), [](
        const char * a, const char * b)
      {
        return strcmp(a, b) == 1;
      });

При смене компилятора, целевой операционной системы или разрядности компилируемого приложения данный код может начать работать некорректно.

Исправленный вариант кода:

    std::vector<char *> vec;
    ....
    std::sort(vec.begin(), vec.end(), [](
        const char * a, const char * b)
      {
        return strcmp(a, b) > 0;
      });

Анализатором также считает код ошибочным, если в нём сравнивается результат работы двух strcmp() функций. Подобный код встречается крайне редко, однако на него в любом случае стоит обратить внимание.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки некорректного использования системных процедур и интерфейсов, связанных с обеспечением информационной безопасности (шифрования, разграничения доступа и пр.).

Данная диагностика классифицируется как:

CWE-253 CERT-EXP12-C

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