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