# V3543. AUTOSAR. Cast should not remove 'const' / 'volatile' qualification from the type that is pointed to by a pointer or a reference.

This diagnostic rule is based on the software development guidelines developed by AUTOSAR (AUTomotive Open System ARchitecture).

Removing the 'const' / 'volatile' qualifier can lead to undefined behavior.

- Changing an object declared as 'const' using a pointer/reference to a non-'const' type leads to undefined behavior.
- Accessing an object declared as 'volatile' using a pointer/reference to a non-'volatile' type leads to undefined behavior.

The compiler can optimize the code if undefined behavior occurs. In the code below, for example, the compiler can make the loop infinite:

    inline int foo(bool &flag)
    {
      while (flag)
      {
        // do some stuff...
      }

      return 0;
    }

    int main()
    {
      volatile bool flag = true;
      return foo(const_cast<bool &>(flag));
    }

Another example of non-compliant code:

    void my_swap(const int *x, volatile int *y)
    {
      auto _x = const_cast<int*>(x);
      auto _y = const_cast<int*>(y);
      swap(_x, _y);
    }

    void foo()
    {
      const int x = 30;
      volatile int y = 203;
      my_swap(&x, &y); // <=
    }

This diagnostic is classified as:

AUTOSAR-A5.2.3