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

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

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

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

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

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

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



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

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