При анализе некоторого Boost-зависимого кода через статический анализатор Clang я получил следующую ошибку:
Логическая ошибка Вызванный указатель на объект C ++ — пустое использование.hpp 22
из следующего кода в boost/concept/usage.hpp
template <class Model>
struct usage_requirements
{
~usage_requirements() { ((Model*)0)->~Model(); }
};
Вопрос: это реальная ошибка в Boost или Boost.Concept вызывает деструктор через нулевой указатель, чтобы каким-то образом генерировать ошибки компилятора во время проверки концепции?
* Отказ от ответственности. Возьми это с солью, я ни в коем случае не эксперт по Boost Concept.
Он использовался для того, чтобы заставить компилятор создавать деструктор «Модель», чтобы компилятор генерировал ошибки для концептуальных сбоев.
usage_requirements
используется вместе с BOOST_CONCEPT_USAGE
который используется при создании новых концепций, см. Создание концепций в документации.
# define BOOST_CONCEPT_USAGE(model) \
model(); /* at least 2.96 and 3.4.3 both need this :( */ \
BOOST_CONCEPT_ASSERT((boost::concepts::usage_requirements<model>)); \
~model()
Который используется как:
BOOST_CONCEPT_USAGE(InputIterator)
{
X j(i); // require copy construction
same_type(*i++,v); // require postincrement-dereference returning value_type
X& x = ++j; // require preincrement returning X&
}
Что в конечном итоге, как:
model(); /* at least 2.96 and 3.4.3 both need this :( */ \
BOOST_CONCEPT_ASSERT((boost::concepts::usage_requirements<model>)); \
~model()
{
X j(i); // require copy construction
same_type(*i++,v); // require postincrement-dereference returning value_type
X& x = ++j; // require preincrement returning X&
}
Как видите, требования концепции в конечном итоге model
деструктор. Вот почему нам нужно обмануть компилятор, чтобы создать его экземпляр.
Других решений пока нет …