【问题标题】:Why does Boost.Concept call destructors through null pointers?为什么Boost.Concept通过空指针调用析构函数?
【发布时间】:2013-07-05 09:27:46
【问题描述】:

通过 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 通过空指针调用析构函数以在概念检查期间以某种方式生成编译器错误?

【问题讨论】:

    标签: c++ boost c++11 clang-static-analyzer c++-concepts


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 但这不会也通过例如实例化。一个临时的Model().~Model();?
    • @TemplateRex 需要默认可构造性。拥有一个到处都需要随机概念的概念库会很糟糕。但是,((Model*)0) 没有引入额外的要求。在 C++11 中,人们将使用 std::declval&lt;Model&gt;() 代替,这不那么奇怪并且具有相同的目的。
    • @R.MartinhoFernandes:我认为 static_assert 使用 C++11 会更好。
    • @R.MartinhoFernandes 啊,是的,declval 更好,并且会关闭静态分析器。
    猜你喜欢
    • 2020-11-19
    • 2023-03-31
    • 2014-02-17
    • 1970-01-01
    • 2012-07-22
    • 2020-02-12
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多