Clang удаляет мертвый код неправильно

я считать это ошибка в 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();
}

В текущем проекте с использованием Qt Ориентация на iOS и Android У меня возникла проблема с этой системой. clang (или компоновщик) идентифицирует SimpleWidget как мертвый код и удаление его (и, следовательно, он не отображается в Repository поскольку registrar() никогда не вызывается.) Кажется, делать это, несмотря на то, что SimpleWidget явно упоминается в registrar(), Если я сделаю ссылку на SimpleWidget в любом из моих других переводческих подразделений, то SimpleWidget больше не зачищается и все работает правильно.

Я что-то упускаю из-за того, как должно работать удаление мертвого кода, или это законная ошибка в цепочке инструментов?

2

Решение

Все объекты в модуле перевода (например, R) необходимо создать до первого вызова функции в этом модуле перевода (файл .cpp). У вас нет вызова ни одной функции в вашем TU, поэтому R не нужно создавать, поэтому registrar() действительно мертвый код, и все, что вызывается исключительно из registrar() одинаково мертв.

Цепочка инструментов правильная.

1

Другие решения


По вопросам рекламы [email protected]