Я работаю над компиляцией Cppcheck в AIX с использованием xlC
.Каждый класс контролера является производным от класса Check
, конструктор которого отвечает за регистрацию этого типа контролера в глобальном статическом списке.
Вот соответствующая часть рассматриваемого кода (имена файлов ссылаются на полный исходный код наGithub):
class Check {
public:
Check() {
instances().push_back(this);
instances().sort();
}
static std::list<Check *> &instances() {
static std::list<Check *> _instances;
return _instances;
}
// ...
};
class CheckBufferOverrun: public Check {
// ...
};
// Register this check class (by creating a static instance of it)
namespace
{
CheckBufferOverrun instance;
}
Обратите внимание, как объявлена статическая переменная _instances
внутри функции static
в файле header (соответствующего файла check.cpp
нет).При компиляции с g++
компилятор и компоновщик работают вместе, обеспечивая единственную реализацию статической функции instances()
и, следовательно, только один экземпляр статического списка _instances
.Все различные классы проверки, созданные в разных файлах .cpp
, регистрируются в одном и том же списке _instances
вместе.
Однако, в xlC
AIX этот же код в конечном итоге создает разные instances()
функция для каждого .cpp
файла, в который он включен, каждый из которых имеет свой статический список _instances
.Таким образом, больше нет единого центрального _instances
списка, который заставляет Cppcheck не выполнять большинство своих проверок.
Какой компилятор в этом случае корректен?
Обновление : Этот вопрос не о том, как исправить проблему, я уже сделал это.Мне интересно, какое поведение правильно .