Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The use of incomplete class declarations (also known as "forward" declarations) is common. While it is possible to declare pointers and references to incomplete classes, because the class definition is not available , it's not possible to access a member of the class, determine the size of the class object, and so on. However, it is possible to cast and delete a pointer to an incomplete class, but this is never a good idea.

...

Note that we used a shared_ptr to refer to the Body. Other common smart pointers, including std::auto_ptr, will still produce undefined behavior.

Non-Compliant Code Example

Similarly, while it is possible to cast a pointer or reference to an incomplete class, it is never a good idea to do so. Casting a class address often involves an adjustment of the address by a fixed amount that can only be determined after the layout and inheritance structure of the class is known, and this information is not available in the case of an incomplete class.

Code Block
bgColor#FFcccc

class B {
    ...
};
B *getMeSomeSOrtOfB();
...
class D; // incomplete declaration
...
B *bp = getMeSomeSortOfB();
D *dp = (D *)bp; // old-stlye cast: legal, but inadvisable
dp = reinterpret_cast<D *>(bp); // new-style cast: legal, but inadvisable

Both an old-stlye cast and a reinterpret_cast may be used to cast the value

Risk Assessment

XXX

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

ERR01-A

1 (low)

2 (probable)

2 (high)

P4

L3

...