Когда я генерирую точечный граф с 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
функций, но она, очевидно, вызывает их.