# V1014. Structures with members of real type are compared byte-wise.

Анализатор обнаружил подозрительный способ сравнения двух структур, которые содержат в себе члены типа float или double.

Пример:

    struct Object
    {
      int Length;
      int Width;
      int Height;
      float Volume;
    };
    bool operator == (const Object &p1, const Object &p2)
    {
      return memcmp(&p1, &p2, sizeof(Object)) == 0;
    }

Так как структура 'Object' содержит числа с плавающей точкой, то их сравнение через 'memcmp' может привести к неожиданному результату. Например, числа -0.0 и 0.0 эквивалентны, но имеют разное битовое представление. Два NaN имеют одинаковое представление, но они не эквивалентны. Возможно стоит использовать оператор == или сравнивать эти переменные с определённой точностью.

Допустим, мы хотим сравнивать члены классы с помощью оператора ==. В этом случае можно вообще удалить 'operator ==', так как компилятор сделает сам всё правильно, реализуя оператор сравнения по умолчанию. Однако, допустим мы хотим написать именно свою функцию, где будем сравнивать члены 'Volume' с определённой точностью. Тогда, исправленный вариант может выглядеть так:

    bool operator == (const Object &p1, const Object &p2)
    {
      return    p1.Length == p2.Length
             && p1.Width  == p2.Width
             && p1.Height == p2.Height
             && fabs(p1.Volume - p2.Volume) <= FLT_EPSILON;
    }

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

CWE-682 CERT-FLP37-C