的boost :: any_range与优化级别-O2导致崩溃

问题描述:

这有什么代码问题:的boost :: any_range与优化级别-O2导致崩溃

#include <iostream> 
#include <vector> 

#include <boost/range/adaptor/transformed.hpp> 
#include <boost/range/any_range.hpp> 


using namespace boost::adaptors; 


using Range = 
    boost::any_range< 
    int, 
    boost::forward_traversal_tag, 
    int, 
    std::ptrdiff_t>; 


void magic(const Range &) {} 


int main() 
{ 
    std::vector<int> xs{0, 1, 2}; 

    auto ys = xs | transformed([](auto x) { return x; }); 

    const Range zs = ys; 
    std::vector<int> us{boost::begin(zs), boost::end(zs)}; 
    magic(us); 

    return 0; 
} 

Complie:

c++ -g -std=c++14 -O2 main.cpp 

运行,并得到段错误

但是,当我编译与较低的优化级别,那么一切都很好。

gdb输出:

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004011a5 in boost::range_detail::any_iterator<int, boost::iterators::forward_traversal_tag, int, long, boost::any_iterator_buffer<64ul> >::dereference (this=<optimized out>) at /usr/include/boost/range/detail/any_iterator.hpp:512 
512      return m_impl->dereference(); 

这是boost::any_range bug,或者我滥用图书馆吗?

程序也崩溃,如果我编译这样说:

c++ -g -std=c++14 -O1 -fisolate-erroneous-paths-dereference main.cpp 

下面的程序崩溃过,如果我选择-O1 -fisolate-erroneous-paths-dereference编译:

#include <iostream> 
#include <vector> 

#include <boost/range/adaptor/transformed.hpp> 
#include <boost/range/any_range.hpp> 


using namespace boost::adaptors; 


using Range = 
    boost::any_range< 
    int, 
    boost::forward_traversal_tag, 
    int &, 
    std::ptrdiff_t>; 


void magic(const Range &xs) { 
    for (auto x: xs) { std::cout << xs; } 
} 


int main() 
{ 
    std::vector<int> xs{0, 1, 2}; 
    auto ys = xs | transformed([](auto x) { return x; }); 
    magic(ys); 
    return 0; 
} 

这是boost bug 10493,与10360有关,它在1.56中引入,仍然存在于1.62中。

问题是,它不是只使用您的reference类型,而是将它包装在mutable_reference_type_generator中,这会阻止您能够返回临时文件。也就是说,当你写:

using Range = 
    boost::any_range< 
    int, 
    boost::forward_traversal_tag, 
    int, 
    std::ptrdiff_t>; 

你明确指定您的reference类型为int,不int&,因为你的范围基本上是一个输入范围。但无论如何,增强内部正在改变它int&,所以你d。。当你写const int intsead int,类型特质不会添加引用,所以你实际上最终const int

其实当我键入标题我的问题,this问题被提供作为可能的答案。

正如答案的问题的建议,我换成intconst int和它的工作:

using Range = 
    boost::any_range< 
    int, 
    boost::forward_traversal_tag, 
    const int, 
    std::ptrdiff_t>; 

我决定要发布的问题,因为作为回答引述问题不显着。