的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问题被提供作为可能的答案。
正如答案的问题的建议,我换成int
与const int
和它的工作:
using Range =
boost::any_range<
int,
boost::forward_traversal_tag,
const int,
std::ptrdiff_t>;
我决定要发布的问题,因为作为回答引述问题不显着。