﻿# 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\.

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

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

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

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

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

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