# V1058. Nonsensical comparison of two different functions' addresses.

Анализатор обнаружил подозрительное сравнение адресов двух функций.

Пример:

    namespace MyNamespace
    {
      int one() noexcept;
      int two() noexcept;
    }

    using namespace MyNamespace;

    void SomeFunction()
    {
      if (one != two)
      {
        // do something
      }
      ....
    }

Сравнение в данном случае всегда вернет 'true', так как 'one' и 'two' – имена функций с совместимыми сигнатурами, объявленных в пространстве имен 'MyNamespace'. Вероятно, что в этом случае предполагалось сравнение возвращаемых значений, но автор кода забыл добавить к именам функций круглые скобки:

    namespace MyNamespace
    {
      int one() noexcept;
      int two() noexcept;
    }

    using namespace MyNamespace;

    void SomeFunction()
    {
      if (one() != two())
      {
        // do something
      }
    }

Также подобный код может быть результатом неудачного рефакторинга. Если внутри функции сравнивались локальные переменные, которые в какой-то момент были удалены из кода, при этом само условие сохранилось, то вполне возможно, что будет происходить сравнение функций с такими же именами.

Пример кода до рефакторинга:

    namespace MyNamespace
    {
      int one() noexcept;
      int two() noexcept;
    }

    using namespace MyNamespace;

    void SomeFunction(int one, int two)
    {
      if (one != two)
      {
        // do something
      }
    }

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

CWE-1025 CERT-EXP16-C