Rule A5-2-4 (required, implementation, automated)

reinterpret_cast shall not be used.

Rationale

Use of reinterpret_cast may violate type safety and cause the program to access a variable as if it were of another, unrelated type.

Example

// $Id: A5-2-4.cpp 289436 2017-10-04 10:45:23Z michal.szczepankiewicz $
#include <cstdint>
#include <string>
void F1() noexcept

{
std::string str = "Hello";

std::int32_t* ptr = reinterpret_cast<std::int32_t*>(&str); // Non-compliant

}
struct A
{
std::int32_t x;
std::int32_t y;
};
class B
{
public:
virtual ~B() {}

private:
std::int32_t x;

};
class C : public B
{
};
class D : public B
{
};

void F2(A* ptr) noexcept

{

B* b1 = reinterpret_cast<B*>(ptr); // Non-compliant

std::int32_t num = 0;

A* a1 = reinterpret_cast<A*>(num); // Non-compliant

A* a2 = (A*)

num; // Compliant with this rule, but non-compliant with Rule A5-2-2.

B* b2 = reinterpret_cast<B*>(num); // Non-compliant

D d;

C* c1 = reinterpret_cast<C*>(&d); // Non-compliant - cross cast

C* c2 = (C*)&d; // Compliant with this rule, but non-compliant with Rule

// A5-2-2. Cross-cast.

}

B* b3 = &d;

// Compliant - class D

is a subclass of class B

See also

MISRA C++ 2008 [7]: Rule 5-2-7 An object with pointer type shall not be converted to an unrelated pointer type, either directly or indirectly. C++ Core Guidelines [11]: Type.1: Don’t use reinterpret_cast.