5

Having a simple program with the following source code,

f1.cpp:

#include "to_map.hpp"

using namespace boost::hana::literals;

void f1() {
    auto tmp = boost::hana::make_tuple(
        boost::hana::make_tuple("x1"_s, 1),
        boost::hana::make_tuple("x2"_s, 2)
    );

    (void)toMap(tmp)["x1"_s];
}

f2.cpp

#include "to_map.hpp"

using namespace boost::hana::literals;

void f2() {
    auto tmp = boost::hana::make_tuple(
        boost::hana::make_tuple("x1"_s, 1)
    );

    (void)toMap(tmp)["x1"_s];
}

to_map.hpp

#pragma once

#include <boost/hana.hpp>

template <class M>
auto toMap(M&& m) {
    return boost::hana::to_map(boost::hana::transform(
        std::forward<M>(m),
        [](auto const& x) {
            return boost::hana::make_pair(boost::hana::at_c<0>(x), boost::hana::at_c<1>(x));
        }));
}

main.cpp:

void f1();
void f2();

int main() {
    f1();
    f2();
}

and compiling it with gcc 7.4.0 using the following CMakeLists.txt file:

cmake_minimum_required(VERSION 2.8)
project(proj)
find_package(Boost 1.65 QUIET REQUIRED)
set(CMAKE_CXX_FLAGS "-std=c++17 -g -O0 -fsanitize=address -DBOOST_HANA_CONFIG_ENABLE_STRING_UDL")
add_executable(${PROJECT_NAME} main.cpp f1.cpp f2.cpp)

causes segmentation fault. Putting the code into a single main.cpp file makes the crash to disappear.

There is no segfault using Clang.

I am wondering what is wrong with the program?

Output of the -fsantitize=address tool:

user@user-B360M-HD3:~/workspace/build-proj-Desktop-Debug$ ./proj
=================================================================
==1899==ERROR: AddressSanitizer: global-buffer-overflow on address 0x55b19cc1f1c0 at pc 0x55b19cc144f4 bp 0x7ffe3cbe8230 sp 0x7ffe3cbe8220
WRITE of size 4 at 0x55b19cc1f1c0 thread T0
    #0 0x55b19cc144f3 in decltype(auto) boost::hana::insert_t::operator()<boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >(boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >&&, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int>&&) const (/home/user/workspace/build-proj-Desktop-Debug/proj+0x194f3)
    #1 0x55b19cc15df3 in decltype(auto) boost::hana::detail::variadic::foldl1_impl<2u, boost::hana::when<true> >::apply<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >(boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >&&, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int>&&) /usr/include/boost/hana/detail/variadic/foldl1.hpp:34
    #2 0x55b19cc15e24 in decltype(auto) boost::hana::detail::variadic::foldl1_t::operator()<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >(boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >&&, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int>&&) const /usr/include/boost/hana/detail/variadic/foldl1.hpp:206
    #3 0x55b19cc15e9f in decltype(auto) boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > >::operator()<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >(boost::hana::pair<boost::hana::string<(char)120, (char)49>, int>&&) const /usr/include/boost/hana/fold_left.hpp:69
    #4 0x55b19cc15ecf in decltype(auto) boost::hana::unpack_impl<boost::hana::basic_tuple_tag, void>::apply<0ul, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int>, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > > >(boost::hana::detail::basic_tuple_impl<std::integer_sequence<unsigned long, 0ul>, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > >&&) /usr/include/boost/hana/basic_tuple.hpp:131
    #5 0x55b19cc15ef8 in decltype(auto) boost::hana::unpack_t::operator()<boost::hana::basic_tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > > >(boost::hana::basic_tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > >&&) const /usr/include/boost/hana/unpack.hpp:47
    #6 0x55b19cc15f21 in decltype(auto) boost::hana::unpack_impl<boost::hana::tuple_tag, void>::apply<boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > > >(boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > >&&) /usr/include/boost/hana/tuple.hpp:225
    #7 0x55b19cc15f4a in decltype(auto) boost::hana::unpack_t::operator()<boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > > >(boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&, boost::hana::detail::variadic_foldl1<boost::hana::insert_t const&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> > >&&) const /usr/include/boost/hana/unpack.hpp:47
    #8 0x55b19cc16058 in decltype(auto) boost::hana::fold_left_impl<boost::hana::tuple_tag, boost::hana::when<true> >::apply<boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >, boost::hana::insert_t const&>(boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >&&, boost::hana::insert_t const&) /usr/include/boost/hana/fold_left.hpp:81
    #9 0x55b19cc160d6 in decltype(auto) boost::hana::fold_left_t::operator()<boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >, boost::hana::insert_t const&>(boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&, boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >&&, boost::hana::insert_t const&) const /usr/include/boost/hana/fold_left.hpp:39
    #10 0x55b19cc1618f in decltype(auto) boost::hana::to_impl<boost::hana::map_tag, boost::hana::tuple_tag, boost::hana::when<true> >::apply<boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> > >(boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&) /usr/include/boost/hana/map.hpp:572
    #11 0x55b19cc161f9 in decltype(auto) boost::hana::to_t<boost::hana::map_tag>::operator()<boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> > >(boost::hana::tuple<boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >&&) const /usr/include/boost/hana/core/to.hpp:76
    #12 0x55b19cc16311 in auto toMap<boost::hana::tuple<boost::hana::tuple<boost::hana::string<(char)120, (char)49>, int> >&>(boost::hana::tuple<boost::hana::tuple<boost::hana::string<(char)120, (char)49>, int> >&) /home/user/workspace/proj/to_map.hpp:11
    #13 0x55b19cc1591c in f2() /home/user/workspace/proj/f2.cpp:10
    #14 0x55b19cc13297 in main /home/user/workspace/proj/main.cpp:6
    #15 0x7f88fee46b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
    #16 0x55b19cc131a9 in _start (/home/user/workspace/build-proj-Desktop-Debug/proj+0x181a9)

0x55b19cc1f1c1 is located 0 bytes to the right of global variable 'insert' defined in '/usr/include/boost/hana/fwd/insert.hpp:29:24' (0x55b19cc1f1c0) of size 1
  'insert' is ascii string ''
SUMMARY: AddressSanitizer: global-buffer-overflow (/home/user/workspace/build-proj-Desktop-Debug/proj+0x194f3) in decltype(auto) boost::hana::insert_t::operator()<boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int> >(boost::hana::detail::map_impl<boost::hana::detail::hash_table<>, boost::hana::basic_tuple<> >&&, boost::hana::pair<boost::hana::string<(char)120, (char)49>, int>&&) const
Shadow bytes around the buggy address:
  0x0ab6b397bde0: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397bdf0: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be00: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be10: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be20: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
=>0x0ab6b397be30: 01 f9 f9 f9 f9 f9 f9 f9[01]f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be40: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be50: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be60: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be70: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
  0x0ab6b397be80: 01 f9 f9 f9 f9 f9 f9 f9 01 f9 f9 f9 f9 f9 f9 f9
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==1899==ABORTING
Barry
  • 286,269
  • 29
  • 621
  • 977
nicolai
  • 1,140
  • 9
  • 17

0 Answers0