V2567. MISRA. 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 MISRA (Motor Industry Software Reliability Association).

Removing the 'const' / 'volatile' qualifier can lead to the following issues:

  • 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:

  • MISRA-C-11.8
  • MISRA-CPP-5.2.5

Bugs Found

Checked Projects
Collected Errors
14 526
This website uses cookies and other technology to provide you a more personalized experience. By continuing the view of our web-pages you accept the terms of using these files. If you don't want your personal data to be processed, please, leave this site. Learn More →