Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::map segfaults when using operator []

I have a strange issue. I'm using a factory registration pattern which refers internally to a std::map. I'm using this approach for multiple components, and registration happens at multiple points in different units of compilation (aka .cpp files). This happens at static variables initialization time (before 'main' gets called). For some strange reason I get a segfault when I'm referring to

map[key] = value;

(basically when I register a particular pfn). Now, if I move the registrations for that particular troublesome components in the same compilation unit, everything works. Again, if I move back the registration of just one component away, I get a segfault.

I have to say, it's not the first time I use this pattern and it works for the same executable for other components (i.e. components spread across multiple .cpp for another factory type get registered at initialization time without issues, using basically similar source code).

what should I do? For now I've left the registration of the components in the same .cpp (and it works flawlessly). How can I better investigate?

I'm using g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

Below stacktrace

0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
(gdb) bt
#0  0x00007ffff793da1a in std::_Rb_tree_decrement(std::_Rb_tree_node_base*) () from /usr/lib/libstdc++.so.6
#1  0x0000000000413fe9 in std::_Rb_tree_iterator, std::allocator > const, http::servlet* (*)()> >::operator-- (
    this=0x7fffffffdff0) at /usr/include/c++/4.4/bits/stl_tree.h:199
#2  0x000000000041379d in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique (this=0x632a20, __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1179
#3  0x00000000004125f2 in std::_Rb_tree, std::allocator >, std::pair, std::allocator > const, http::servlet* (*)()>, std::_Select1st, std::allocator > const, http::servlet* (*)()> >, std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::_M_insert_unique_ (this=0x632a20, __position=..., __v=...) at /usr/include/c++/4.4/bits/stl_tree.h:1217
#4  0x00000000004116c4 in std::map, std::allocator >, http::servlet* (*)(), std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::insert (
    this=0x632a20, __position=..., __x=...) at /usr/include/c++/4.4/bits/stl_map.h:540
#5  0x0000000000410a63 in std::map, std::allocator >, http::servlet* (*)(), std::less, std::allocator > >, std::allocator, std::allocator > const, http::servlet* (*)()> > >::operator[] (
    this=0x632a20, __k=...) at /usr/include/c++/4.4/bits/stl_map.h:450
#6  0x000000000040e3b1 in http::servlet::add_creator (type=0x4234d0 "/gpu/european_opt_xyz", func=0x421567 )
    at ./src/http.cpp:336
like image 801
Emanuele Avatar asked Feb 25 '23 21:02

Emanuele


1 Answers

You could be coming up against the static initialization problem:

https://isocpp.org/wiki/faq/ctors#static-init-order

How are you initialising the map?

like image 86
Nick Avatar answered Feb 27 '23 10:02

Nick