1

通过 Clang 静态分析器分析一些 Boost 依赖的代码时,我得到了以下错误:

逻辑错误 Called C++ object pointer is null usage.hpp 22

从下面的代码boost/concept/usage.hpp

template <class Model>
struct usage_requirements
{
    ~usage_requirements() { ((Model*)0)->~Model(); }
};

问题:这是 Boost 中的真正错误还是 Boost.Concept 通过空指针调用析构函数以在概念检查期间以某种方式生成编译器错误?

4

1 回答 1

3

*免责声明。加点盐吧,我绝不是 Boost Concept 专家。

它用于使编译器实例化“模型”析构函数以使编译器为概念失败生成错误。

usage_requirementsBOOST_CONCEPT_USAGEwhich 在创建新概念时一起使用,请参阅文档中的创建概念

#   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析构函数中。这就是为什么我们需要欺骗编译器来实例化它。

于 2013-07-05T09:50:37.867 回答