Is calling virtual functions indirectly from the constructor always undefined behavior?

I am working on creating Cppcheck on AIX using the compiler xlC(see previous question ). All Checker classes are produced from a class Checkwhose constructor registers each object in the global list:

check.h

class Check {
public:
    Check() {
        instances().push_back(this);
        instances().sort();
    }
    static std::list<Check *> &instances();
    virtual std::string name() const = 0;
private:
    bool operator<(const Check *other) const {
        return (name() < other->name());
    }
};

checkbufferoverrun.h

class CheckBufferOverrun: public Check {
public:
    // ...
    std::string name() const {
        return "Bounds checking";
    }
};

, , instances().sort(). sort() Check::operator<(), Check::name() instances() , Check, , ( Check::Check()). , undefined ->name() CheckBufferOverrun.

undefined, ?

: , sort() , , Cppcheck . , , , .

. , , ( ). , , , sort() (, ), , Check::operator<(const Check *) sort()! , sort(), , . g++, xlC, Cppcheck.

+3
4

, undefined. 10.4/6

- ( ) ; (10.3) , , ( ) ( ) undefined.

+4

, undefined.

, ( "}" ), , , ( ) ( ).

, , , . , , ++ .

- , . 2

instances().push_back(this);
instances().sort();

, , , .

+2

, . , A, B ( A), C ( B) , B .

:

class check {
private Check () { ... }
public:
    static Check* createInstance() {
        Check* check = new Check();
        instances().push_back(check);
        instances().sort();
    }
...
}
0

, , : Checker () Check.

, : Checker, -.

, - : Checker ctor ( , Checker ctor).

ctors ( " " ) . , Checker, ( ) CheckerRegister ( , , ).

singleton , , Checkerregister Checker.

- getCheckerRegister Checker.

, Checker :

CheckBufferOverrun: public Check { :    CheckBufferOverrun: ( " " ) {    // , arg?    } :   CheckBufferOverrun makeCheckBufferOverrun() {      CheckBufferOverrun that = new CheckBufferOverrun();

   // get the singleton, pass it something fully constructed
   Checker.getCheckerRegister.register(that) ;
   return that;
}

, , . , ++ , templated , Checker.

0

Source: https://habr.com/ru/post/1789358/


All Articles