Clang 错误地删除死代码
Clang removing dead code incorrectly
我认为这是clang
或OSX链接器中的错误,但我想在这里询问以确保。
我在 C++ 程序中有以下(简化的)设置。单例存储库 class:
class Repository {
public:
static Repository *instance();
void registerWidget(const char *name, Widget *w) {}
};
小部件界面:
class Widget {
public:
virtual void widgetify() = 0;
};
最后一个简单的小部件:
class SimpleWidget : public Widget {
public:
virtual void widgetify() {}
};
Inside SimpleWidget
我想在 运行 时自动将小部件注册到 Repository
。通常我使用匿名名称空间和注册函数来执行此操作。像这样:
namespace {
bool registrar() {
Registrar::instance() -> registerWidget("SimpleWidget", new SimpleWidget);
return true;
}
bool R = registrar();
}
在当前使用 Qt
目标 iOS 和 Android 的项目中,我 运行 遇到了这个系统的问题。 clang
(或链接器)将 SimpleWidget
识别为死代码并将其剥离(因此它不会出现在 Repository
中,因为 registrar()
从未被调用过。)它尽管在 registrar()
中明显引用了 SimpleWidget
,但似乎还是这样做了。如果我在我的任何其他翻译单元中引用 SimpleWidget
,则 SimpleWidget
不再被删除并且一切正常。
我是否遗漏了一些关于死代码剥离应该如何工作的信息,或者这是一个合法的工具链错误?
翻译单元(例如 R)中的所有对象都需要在第一次调用该翻译单元(.cpp 文件)中的函数之前创建。您没有调用 TU 中的单个函数,因此不需要创建 R
,因此 registrar()
确实是死代码,任何专门从 registrar()
调用的都是同样死了。
工具链正确。
我认为这是clang
或OSX链接器中的错误,但我想在这里询问以确保。
我在 C++ 程序中有以下(简化的)设置。单例存储库 class:
class Repository {
public:
static Repository *instance();
void registerWidget(const char *name, Widget *w) {}
};
小部件界面:
class Widget {
public:
virtual void widgetify() = 0;
};
最后一个简单的小部件:
class SimpleWidget : public Widget {
public:
virtual void widgetify() {}
};
Inside SimpleWidget
我想在 运行 时自动将小部件注册到 Repository
。通常我使用匿名名称空间和注册函数来执行此操作。像这样:
namespace {
bool registrar() {
Registrar::instance() -> registerWidget("SimpleWidget", new SimpleWidget);
return true;
}
bool R = registrar();
}
在当前使用 Qt
目标 iOS 和 Android 的项目中,我 运行 遇到了这个系统的问题。 clang
(或链接器)将 SimpleWidget
识别为死代码并将其剥离(因此它不会出现在 Repository
中,因为 registrar()
从未被调用过。)它尽管在 registrar()
中明显引用了 SimpleWidget
,但似乎还是这样做了。如果我在我的任何其他翻译单元中引用 SimpleWidget
,则 SimpleWidget
不再被删除并且一切正常。
我是否遗漏了一些关于死代码剥离应该如何工作的信息,或者这是一个合法的工具链错误?
翻译单元(例如 R)中的所有对象都需要在第一次调用该翻译单元(.cpp 文件)中的函数之前创建。您没有调用 TU 中的单个函数,因此不需要创建 R
,因此 registrar()
确实是死代码,任何专门从 registrar()
调用的都是同样死了。
工具链正确。