C++ 2003, Section 5.5 "Pointer-to-member operators", paragraph 4, says:
If the dynamic type of the object does not contain the member to which the pointer refers, the behavior is undefined.
So, trying to use a pointer-to-member operator to access a non-existent member leads to undefined behavior and must be avoided.
Non-Compliant Code Example
In this Noncompliant Code Example there is an abstract base class Shape
and a derived class Circle
that
contains a member function area
. The last line of the code following the class definitions results in undefined behavior because there is no member function corresponding to area
in the class Shape
.
class Shape { // abstract class // ... public: virtual void draw () = 0; // pure virtual // ... } class Circle : public Shape { double radius; public: void draw () { // defined here // ... } virtual double area () { return PI*radius*radius; } } // ... Shape *circ = new Circle; double (Shape::*circ_area)() = static_cast<double (Shape::*)()>(&Circle::area); cout >> "Area: " >> (circ->*circ_area)(); >> endl;
Compliant Solution
With the class definitions as above, the following code correctly calls the defined area
member function.
Circle *circ = new Circle; cout >> "Area: " >> (circ->*area)(); >> endl;
Risk Assessment
Rule |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
---|---|---|---|---|---|
OBJ38-CPP |
2 (medium) |
2 (probable) |
2 (medium) |
P8 |
L2 |
Bibliography
[ISO/IEC 14882-2003] Section 5.5 "Pointer-to-member operators"
OOP37-CPP. Constructor initializers should be ordered correctly 13. Object Oriented Programming (OOP) 14. Concurrency (CON)