This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/41865] New: map as class static member variable causing crash on process exit


Hi,
Our application is crashing at the time of exit when a static member variable
of this following typedef is getting cleared by garbage collecter:
typedef STL_NS::map<const char *, FBOperator, STLLessCompareStringNoCase >
FBOperatorPrecedence;

This map is defined as protected:
static FBOperatorPrecedence ops_;
static int init_;
static int fillit();

fillit() function is used to populate this map as below:
ops_["+"]      = FBOperator( n, FBOperator::Binary, OPPLUS,   false,
&FBOperand::operator+ );
ops_["-"]      = FBOperator( n, FBOperator::Binary, OPMINUS,  false,
&FBOperand::operator- );
ops_["*"]      = FBOperator( n, FBOperator::Binary, OPTIMES,  false,
&FBOperand::operator* );
ops_["/"]      = FBOperator( n, FBOperator::Binary, OPDIV,    false,
&FBOperand::operator/ );
ops_["<"]      = FBOperator( n, FBOperator::Binary, OPLT,     false,
&FBOperand::operator< );
ops_[">"]      = FBOperator( n, FBOperator::Binary, OPGT,     false,
&FBOperand::operator> );
ops_["<="]     = FBOperator( n, FBOperator::Binary, OPLTEQ,   false,
&FBOperand::operator<= );
ops_[">="]     = FBOperator( n, FBOperator::Binary, OPGTEQ,   false,
&FBOperand::operator>= );
ops_["="]      = FBOperator( n, FBOperator::Binary, OPEQ,     false,
&FBOperand::operator== );
ops_["=="]     = FBOperator( n, FBOperator::Binary, OPEQ,     false,
&FBOperand::operator== ) ;
ops_["is" ]    = FBOperator( n, FBOperator::Binary, OPEQ,     false,
&FBOperand::operator== );
ops_["!="]     = FBOperator( n, FBOperator::Binary, OPNE,     false,
&FBOperand::operator!= ) ;
ops_["<>"]     = FBOperator( n, FBOperator::Binary, OPNE,     false,
&FBOperand::operator!= );
ops_["isnot"]  = FBOperator( n, FBOperator::Binary, OPNE,     false,
&FBOperand::operator!= );
ops_["&&"]     = FBOperator( n++, FBOperator::Binary, OPLAND,   false,
&FBOperand::operator&& );
ops_["&"]      = FBOperator( n, FBOperator::Binary, OPBAND,   false,
&FBOperand::bitwiseand);
ops_["and"]    = FBOperator( n, FBOperator::Binary, OPLAND,   false,
&FBOperand::operator&& );
ops_["AND"]    = FBOperator( n, FBOperator::Binary, OPLAND,   false,
&FBOperand::operator&& );
ops_["or"]     = FBOperator( n, FBOperator::Binary, OPLOR,    false,
&FBOperand::operator|| );
ops_["OR"]     = FBOperator( n, FBOperator::Binary, OPLOR,    false,
&FBOperand::operator|| );
ops_["||"]     = FBOperator( n, FBOperator::Binary, OPLOR,    false,
&FBOperand::operator|| );
ops_["|"]      = FBOperator( n, FBOperator::Binary, OPBOR,    false,
&FBOperand::bitwiseor );
ops_["in"]     = FBOperator( n, FBOperator::Binary, OPIN,     true, 
&FBOperand::in  );
ops_["notin"]  = FBOperator( n, FBOperator::Binary, OPNOTIN,  true, 
&FBOperand::notin  );
ops_["like"]   = FBOperator( n, FBOperator::Binary, OPLIKE,   true, 
&FBOperand::like );
ops_["notlike"]= FBOperator( n, FBOperator::Binary, OPNOTLIKE,true, 
&FBOperand::notlike  );
ops_["!"]      = FBOperator( ++n, FBOperator::Unary,  OPNOT,    false, (opfn)0
);
ops_["not"]    = FBOperator( ++n, FBOperator::Unary,  OPNOT,    false, (opfn)0
);

When program exits, at that time this static member variable gets deleted by
garbage collector & causes program to abort. Following output is shown on the
screen:
*** glibc detected *** ./a.out: double free or corruption (!prev):
0x0000000000544250 ***
======= Backtrace: =========
/lib64/libc.so.6[0x2b1a463ab34e]
/lib64/libc.so.6(__libc_free+0x6c)[0x2b1a463ac95c]
./a.out[0x420299]
./a.out[0x4202c1]
./a.out[0x42030c]
./a.out[0x420355]
./a.out[0x42033b]
./a.out[0x42033b]
./a.out[0x42033b]
./a.out[0x42033b]
./a.out[0x4209ce]
./a.out[0x420a23]
./a.out[0x41651e]
/lib64/libc.so.6(exit+0x87)[0x2b1a463722a7]
/lib64/libc.so.6(__libc_start_main+0xfb)[0x2b1a4635d15b]
./a.out(__gxx_personality_v0+0xa9)[0x404c59]
======= Memory map: ========
00400000-0043a000 r-xp 00000000 00:20 916340                            
/home/gborse/a.out
00539000-0053b000 rw-p 00039000 00:20 916340                            
/home/gborse/a.out
0053b000-0055c000 rw-p 0053b000 00:00 0                                  [heap]
2b1a459e3000-2b1a459fe000 r-xp 00000000 08:02 350653                    
/lib64/ld-2.4.so
2b1a459fe000-2b1a45a00000 rw-p 2b1a459fe000 00:00 0
2b1a45afd000-2b1a45aff000 rw-p 0001a000 08:02 350653                    
/lib64/ld-2.4.so
2b1a45aff000-2b1a45c6e000 r-xp 00000000 08:11 345510                    
/app/thirdpartylibs/gmrACE-5.6-64/lib/libACE-5.6.so
2b1a45c6e000-2b1a45d6e000 ---p 0016f000 08:11 345510                    
/app/thirdpartylibs/gmrACE-5.6-64/lib/libACE-5.6.so
2b1a45d6e000-2b1a45db2000 rw-p 0016f000 08:11 345510                    
/app/thirdpartylibs/gmrACE-5.6-64/lib/libACE-5.6.so
2b1a45db2000-2b1a45db3000 rw-p 2b1a45db2000 00:00 0
2b1a45db3000-2b1a45e82000 r-xp 00000000 08:11 1016022                   
/app/devtools/gcc-4.2.3/lib64/libstdc++.so.6.0.9
2b1a45e82000-2b1a45f82000 ---p 000cf000 08:11 1016022                   
/app/devtools/gcc-4.2.3/lib64/libstdc++.so.6.0.9
2b1a45f82000-2b1a45fa3000 rw-p 000cf000 08:11 1016022                   
/app/devtools/gcc-4.2.3/lib64/libstdc++.so.6.0.9
2b1a45fa3000-2b1a45fb5000 rw-p 2b1a45fa3000 00:00 0
2b1a45fc4000-2b1a45fc5000 rw-p 2b1a45fc4000 00:00 0
2b1a45fc5000-2b1a46019000 r-xp 00000000 08:02 350681                    
/lib64/libm-2.4.so
2b1a46019000-2b1a46118000 ---p 00054000 08:02 350681                    
/lib64/libm-2.4.so
2b1a46118000-2b1a4611a000 rw-p 00053000 08:02 350681                    
/lib64/libm-2.4.so
2b1a4611a000-2b1a46126000 r-xp 00000000 08:11 1016001                   
/app/devtools/gcc-4.2.3/lib64/libgcc_s.so.1
2b1a46126000-2b1a46226000 ---p 0000c000 08:11 1016001                   
/app/devtools/gcc-4.2.3/lib64/libgcc_s.so.1
2b1a46226000-2b1a46228000 rw-p 0000c000 08:11 1016001                   
/app/devtools/gcc-4.2.3/lib64/libgcc_s.so.1
2b1a46228000-2b1a4623a000 r-xp 00000000 08:02 350699                    
/lib64/libpthread-2.4.so
2b1a4623a000-2b1a46339000 ---p 00012000 08:02 350699                    
/lib64/libpthread-2.4.so
2b1a46339000-2b1a4633b000 rw-p 00011000 08:02 350699                    
/lib64/libpthread-2.4.so
2b1a4633b000-2b1a46340000 rw-p 2b1a4633b000 00:00 0
2b1a46340000-2b1a46467000 r-xp 00000000 08:02 350662                    
/lib64/libc-2.4.so
2b1a46467000-2b1a46567000 ---p 00127000 08:02 350662                    
/lib64/libc-2.4.so
2b1a46567000-2b1a4656a000 r--p 00127000 08:02 350662                    
/lib64/libc-2.4.so
2b1a4656a000-2b1a4656c000 rw-p 0012a000 08:02 350662                    
/lib64/libc-2.4.so
2b1a4656c000-2b1a46571000 rw-p 2b1a4656c000 00:00 0
2b1a46571000-2b1a46579000 r-xp 00000000 08:02 350703                    
/lib64/librt-2.4.so
2b1a46579000-2b1a46678000 ---p 00008000 08:02 350703                    
/lib64/librt-2.4.so
2b1a46678000-2b1a4667a000 rw-p 00007000 08:02 350703                    
/lib64/librt-2.4.so
2b1a4667a000-2b1a4667c000 r-xp 00000000 08:02 350668                    
/lib64/libdl-2.4.so
2b1a4667c000-2b1a4677c000 ---p 00002000 08:02 350668                    
/lib64/libdl-2.4.so
2b1a4677c000-2b1a4677e000 rw-p 00002000 08:02 350668                    
/lib64/libdl-2.4.so
2b1a4677e000-2b1a46780000 rw-p 2b1a4677e000 00:00 0
2b1a46780000-2b1a4683e000 r-xp 00000000 08:11 344454    Aborted
====================================================================
Stakc trace of this in gdb is as below:
Program received signal SIGABRT, Aborted.
[Switching to Thread 47958599448208 (LWP 8516)]
0x00002b9e3b07bb95 in raise () from /lib64/libc.so.6
(gdb) where
#0  0x00002b9e3b07bb95 in raise () from /lib64/libc.so.6
#1  0x00002b9e3b07cf90 in abort () from /lib64/libc.so.6
#2  0x00002b9e3b0b235b in __libc_message () from /lib64/libc.so.6
#3  0x00002b9e3b0b734e in malloc_printerr () from /lib64/libc.so.6
#4  0x00002b9e3b0b895c in free () from /lib64/libc.so.6
#5  0x0000000000420299 in
__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<char const* const,
FBOperator> > >::deallocate (this=0x53ae80,
    __p=0x544250) at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/ext/new_allocator.h:97
#6  0x00000000004202c1 in std::_Rb_tree<char const*, std::pair<char const*
const, FBOperator>, std::_Select1st<std::pair<char const* const, FBOperator> >,
STLLessCompareStringNoCase, std::allocator<std::pair<char const* const,
FBOperator> > >::_M_put_node (this=0x53ae80, __p=0x544250)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:371
#7  0x000000000042030c in std::_Rb_tree<char const*, std::pair<char const*
const, FBOperator>, std::_Select1st<std::pair<char const* const, FBOperator> >,
STLLessCompareStringNoCase, std::allocator<std::pair<char const* const,
FBOperator> > >::_M_destroy_node (this=0x53ae80, __p=0x544250)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:401
#8  0x0000000000420355 in std::_Rb_tree<char const*, std::pair<char const*
const, FBOperator>, std::_Select1st<std::pair<char const* const, FBOperator> >,
STLLessCompareStringNoCase, std::allocator<std::pair<char const* const,
FBOperator> > >::_M_erase (this=0x53ae80, __x=0x544250)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:1325
#9  0x000000000042033b in std::_Rb_tree<char const*, std::pair<char const*
const, FBOperator>, std::_Select1st<std::pair<char const* const, FBOperator> >,
STLLessCompareStringNoCase, std::allocator<std::pair<char const* const,
FBOperator> > >::_M_erase (this=0x53ae80, __x=0x5441f0)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:1323
#10 0x000000000042033b in std::_Rb_tree<char const*, std::pair<char const*
const, FBOperator>, std::_Select1st<std::pair<char const* const, FBOperator> >,
STLLessCompareStringNoCase, std::allocator<std::pair<char const* const,
FBOperator> > >::_M_erase (this=0x53ae80, __x=0x5443d0)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:1323
#11 0x000000000042033b in std::_Rb_tree<char const*, std::pair<char const*
const, FBOperator>, std::_Select1st<std::pair<char const* const, FBOperator> >,
STLLessCompareStringNoCase, std::allocator<std::pair<char const* const,
FBOperator> > >::_M_erase (this=0x53ae80, __x=0x543d70)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:1323
#12 0x000000000042033b in std::_Rb_tree<char const*, std::pair<char const*
const, FBOperator>, std::_Select1st<std::pair<char const* const, FBOperator> >,
STLLessCompareStringNoCase, std::allocator<std::pair<char const* const,
FBOperator> > >::_M_erase (this=0x53ae80, __x=0x543cb0)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:1323
#13 0x00000000004209ce in ~_Rb_tree (this=0x53ae80)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_tree.h:592
#14 0x0000000000420a23 in ~map (this=0x53ae80)
    at
/app/devtools/gcc-4.2.3/lib/gcc/x86_64-unknown-linux-gnu/4.2.3/../../../../include/c++/4.2.3/bits/stl_map.h:94
#15 0x000000000041651e in __tcf_0 () at src/FBEvaluate.cpp:503
#16 0x00002b9e3b07e2a7 in exit () from /lib64/libc.so.6
#17 0x00002b9e3b06915b in __libc_start_main () from /lib64/libc.so.6
#18 0x0000000000404c59 in _start ()


-- 
           Summary: map as class static member variable causing crash on
                    process exit
           Product: gcc
           Version: 4.2.3
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: ganesh dot borse at credit-suisse dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41865


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]