Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V681. The language standard does not...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V681. The language standard does not define order in which 'Foo' functions are called during evaluation of arguments.

01 Ноя 2013

Анализатор обнаружил потенциальную ошибку, связанную с последовательностью вызова функций.

Согласно стандарту языка Си++, не определена последовательность вычисления фактических аргументов функции. Для выражения 'A(B(), C())' нельзя сказать, вызовется в начале функция 'B()' или 'C()'. Какая функция будет вызвана первой, зависит от компилятора, параметров компиляции и так далее.

Изредка, это может порождать проблемы. Анализатор выдает предупреждения на код, который выглядит наиболее подозрительно. К сожалению, набор случаев, когда выдаётся предупреждение, сознательно сильно ограничен. Это сделано для того, чтобы он не выдавал ложные срабатывания. Уж очень часто, в качестве фактических аргументов используется вызовы других функций. И в большинстве случаев это безопасно.

Пример кода, для которого PVS-Studio выдаст предупреждение:

Point ReadPoint()
{
  return Point(ReadFixed(), ReadFixed());
}

Этот код может привести к тому, что значение X и Y могут быть перепутаны. Неизвестно, какой из аргументов начнет вычисляться первым.

Корректный код:

Point ReadPoint()
{
  float x = ReadFixed();
  return Point(x, ReadFixed());
}

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

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