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;
}
Данная диагностика классифицируется как:
|
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6011. |