# V503. Nonsensical comparison: pointer < 0.

Анализатор обнаружил фрагмент кода, содержащий бессмысленное сравнение. С большой вероятностью данный код содержит логическую ошибку.

Пример кода:

    class MyClass {
    public:
      CObj *Find(const char *name);
      ...
    } Storage;

    if (Storage.Find("foo") < 0)
      ObjectNotFound();

Кажется практически невероятным, что подобный код может присутствовать в программе. Однако причина его появления может быть достаточно проста. Предположим, что в программе имеется следующий код:

    class MyClass {
    public:
      // Если объект не найден, то функция
      // Find возвращает значение -1.
      ptrdiff_t Find(const char *name);
      CObj *Get(ptrdiff_t  index);
      ...
    } Storage;
    ...
    ptrdiff_t index = Storage.Find("ZZ");
    if (index >= 0)
      Foo(Storage.Get(index));
    ...
    if (Storage.Find("foo") < 0)
      ObjectNotFound();

Это корректный, но не изящный код. В процессе рефакторинга класс MyClass может быть переписан следующим образом:

    class MyClass {
    public:
      CObj *Find(const char *name);
      ...
    } Storage;

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

    CObj *obj = Storage.Find("ZZ");
    if (obj != nullptr)
      Foo(obj);

Второй фрагмент кода успешно скомпилируется и его легко пропустить, тем самым создав рассматриваемую ошибку:

    if (Storage.Find("foo") < 0)
      ObjectNotFound();

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

CWE-697 CERT-EXP08-C

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