﻿# 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](https://www.autosar.org/) \(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:

```cpp
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: 

```cpp
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); // <=
}
```