# V6011. The expression contains a suspicious mix of integer and real types.

Анализатор обнаружил потенциальную ошибку в выражении, где совместно используются целочисленные и real-типы данных. Под real-типами понимаются такие типы, как 'float' и 'double'.

Давайте посмотрим, как может проявить себя ошибка на практике.

    boolean IsInRange(int object_layer_width, int object_layer_height)
    {
      return  object_layer_height != 0 &&
              object_layer_width/object_layer_height > 0.1 &&
              object_layer_width/object_layer_height < 10;
    }

Здесь целочисленное значение сравнивается с константой '0.1'. Это очень подозрительно. Предположим, что переменные имеют следующие значения:

- object_layer_width = 20;
- object_layer_height = 100;

Программист ожидает, что при делении этих чисел результат будет равен '0.2'. Это подходящее значение, так оно попадает в диапазон (0.1..10).

На самом деле, результат деления будет равен 0. Деление осуществляется над целочисленными типами данных. Потом, при сравнении с '0.1' произойдет расширение до типа 'double', но будет уже поздно. Чтобы исправить код, необходимо заранее использовать явное приведение типов:

    boolean IsInRange(int object_layer_width, int object_layer_height)
    {
      return  object_layer_height != 0 &&
              (double)object_layer_width/object_layer_height > 0.1 &&
              (double)object_layer_width/object_layer_height < 10;
    }

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

CWE-682 CERT-NUM13-J

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