叮当错误地删除了死代码
Clang removing dead code incorrectly
我认为这是clang
或OSX链接器中的一个错误,但我想在这里询问以确保。
我在C++程序中有以下(简化的)设置。单例存储库类:
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() {}
};
在SimpleWidget
里面,我想在运行时自动将小部件注册到Repository
。通常我使用匿名命名空间和注册函数来执行此操作。像这样:
namespace {
bool registrar() {
Registrar::instance() -> registerWidget("SimpleWidget", new SimpleWidget);
return true;
}
bool R = registrar();
}
在当前使用针对iOS和Android的Qt
项目中,我遇到了这个系统的问题。 clang
(或链接器)将SimpleWidget
标识为死代码并将其剥离(因此它不会显示在Repository
中,因为从未调用registrar()
。尽管事实上SimpleWidget
显然在registrar()
中被引用,但它似乎这样做了。如果我在任何其他翻译单元中引用SimpleWidget
,则SimpleWidget
不再被剥离,一切正常。
我是否错过了一些关于死代码剥离应该如何工作的东西,或者这是一个合法的工具链错误?
翻译单元(如 R)中的所有对象都需要在首次调用该翻译单元(.cpp 文件)中的函数之前创建。你没有在 TU 中调用单个函数,所以不需要创建R
,所以registrar()
确实是死代码,任何单独从 registrar()
调用的东西都同样死了。
工具链是正确的。
相关文章:
- 为什么示例代码访问IUnknown中已删除的内存
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 是否可以使用 C++ 中的模板减小删除代码大小
- 删除C++继承中虚拟类成员的代码重复
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 删除继承中的代码重复?
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 删除原子多线程代码中的容器
- 使用 ostream 变量删除代码重复
- 可视代码 删除函数括号内的空格
- Qt创建者-如何删除Clang代码模型
- 更正代码c++指针并删除
- 有没有一种预处理器的方法可以从调试符号中删除代码段
- 删除被注释掉的代码,而不是实际的赞美
- 在 cpp 中验证路径:无法使用 ASCII 代码删除特殊字符
- 旧项目中的重复代码删除策略
- 应由库或客户端代码删除已加载库中的对象实例
- 内联和死代码删除优化是否可以阻止模板实例化