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 undefined behavior.
For example:
- 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:
|