Что такое "внешний узел" и безымянный узел в сгенерированных `opt` точечных графах? - PullRequest
0 голосов
/ 14 февраля 2019

Когда я генерирую точечный граф с opt -analyze -dot-callgraph, генерируются два «специальных» узла, один с именем / меткой external node и один без назначенной метки.

Что они представляют?

Редактировать: В этом идиотском примере:

#include <cstdio>

class Animal
{
public:
    virtual void speak() = 0;
};

class Dog : public Animal
{
public:
    void speak() override { printf("Woof!\n"); }
};

class Cat : public Animal
{
public:
    void speak() override { printf("Meow!\n"); }
};

class Programmer : public Animal
{
public:
    void speak() override { printf("Hello, world!\n"); }
};


int main()
{
    Animal *dog = new Dog;
    Animal *cat = new Cat;
    Animal *guy = new Programmer;

    dog->speak();
    cat->speak();
    guy->speak();

    delete dog;
    delete cat;
    delete guy;
}

При создании графа вызовов мы имеем ситуацию, когда external node вызывает все реализации speak.Почему это так?Только main зовет их;как что-то извне может вызвать их?

Мы также видим, что main вызывает "безымянный" узел.Что это значит?

Еще более запутанно, если мы заменим чистую вирулентную speak в Animal на:

virtual void speak() { printf("Generic animal sound!\n"); }

Тогда в графе вызовов больше не будет отображаться main вызовлюбая из speak функций, но она, очевидно, вызывает их.

...