# V764. Possible incorrect order of arguments passed to function.

The analyzer has detected a suspicious sequence of arguments being passed to a function: some of the argument names do not match the expected parameter names. It may indicate an error when passing values to the function.

Here is the function declaration:

    void SetRGB(unsigned r, unsigned g, unsigned b);

The example of incorrect code:

    void Foo()
    {
      unsigned R = 0, G = 0, B = 0;
      ....
      SetRGB(R, B, G);
      ....
    }

When setting the object color, the programmer accidentally swapped the blue and green color parameters.

The fixed code version should look like this:

    SetRGB(R, G, B);

## Additional Settings

If the function accepts the boundaries of a range as parameters, the corresponding parameters can be marked as the lower and upper bounds. If the argument order is violated during the function call, the corresponding warning can be issued.

The example. There is a function semantically similar to 'std::clamp' with the following signature:

    bool foo(int v, int lo, int hi);

This function checks that the value of the first parameter lies within the range provided by the second (lower bound) and third (upper bound) parameters.

Let's say there is the following function call:

    if (foo(v, max, min))
    {
      ....
    }

The arguments for the lower and upper bounds are swapped. To get the warning on the function call, mark the second parameter of the `foo` function as `lower_bound` and the third as `upper_bound`. For additional configuration of the V575 diagnostic rule, mark the first parameter of the `foo` function as `in_range_value`.

The fixed code:

    if (foo(x, min, max))
    {
      ....
    }

See the examples of function parameter annotations here.

Note. This annotation is required only for user-defined functions.

This diagnostic is classified as:

CWE-683 CERT-EXP37-C

You can look at examples of errors detected by the V764 diagnostic.