exponenta event banner

Порядок проверок времени выполнения программы проверки кода

Если для одной и той же операции выполняется несколько проверок, средство проверки кода выполняет их в определенном порядке. Порядок проверок важен только в том случае, если одна из проверок не имеет зеленого цвета. Если проверка имеет красный цвет, последующие проверки не выполняются. Если проверка оранжевая, последующие проверки выполняются для уменьшенного набора значений. Дополнительные сведения см. в разделе Анализ проверки кода после проверки красного и оранжевого цветов.

Простым примером является порядок проверок по отмене привязки указателя. Средство проверки кода сначала проверяет, инициализирован ли указатель, а затем указывает ли указатель на допустимое местоположение. Проверка Illegally dereferenced pointer следует за проверкой Non-initialized local variable.

Если один из операндов в двоичной операции является переменной с плавающей запятой, средство проверки кода выполняет следующие проверки операции в следующем порядке:

  1. Invalid operation on floats: Если вы включите опцию, чтобы учитывать не конечных плавающих, эта проверка определяет, может ли операция привести к NaN.

  2. Overflow: Эта проверка определяет, переполняется ли результат.

    Если включена опция учета неграничных поплавков, эта проверка определяет, может ли операция привести к бесконечностям.

  3. Subnormal float: Если включен режим субнормального обнаружения, эта проверка определяет, может ли операция привести к субнормальным значениям.

Например, предположим, что у вас есть возможность запретить бесконечности, NaNs и субнормальные результаты. В этом примере операция y = x + 0; проверяется на наличие всех трех проблем. Операция отображается красным цветом, но состоит из трех проверок: оранжевая операция «Invalid» для поплавков, оранжевая операция «Overflow» и красная проверка «Subnormal float».

#include <float.h>
#include <assert.h>

double input();

int main() {
  double x = input();
  double y;
  assert (x != x || x > DBL_MAX  || (x > 0. && x < DBL_MIN));
  y = x + 0.;
  return 0;
}

На + работа, x может иметь три группы значений: x является NaN, x > DBL_MAX, и x > 0. && x < DBL_MIN.

Проверки выполняются в следующем порядке:

  1. Недопустимая операция для плавающих элементов: Проверка имеет оранжевый цвет, поскольку один путь выполнения считает, что x может быть NaN.

    Для следующих проверок этот путь не рассматривается.

  2. Переполнение: Проверка оранжевая, поскольку одна группа путей выполнения считает, что x > DBL_MAX. Для этой группы путей, + операция может привести к бесконечности.

    При следующей проверке эта группа путей не рассматривается.

  3. Субнормальный поплавок: На оставшейся группе путей выполнения, x > 0. && x < DBL_MIN. Все значения x вызвать субнормальные результаты. Поэтому этот чек красный.

Сообщение на панели Сведения о результате отражает это сокращение путей. Сообщение для состояний поднормальной плавающей проверки (when finite) чтобы показать, что бесконечные значения были исключены из рассмотрения.

Значения левого и правого операндов отражают все значения перед операцией, а не уменьшенный набор значений. Поэтому левый операнд по-прежнему показывает Inf и NaN несмотря на то, что эти значения не были учтены для проверки.

См. также

| | | | |

Связанные темы