2016-12-05 14 views
0

私はGCC 5.4.0で自分のGentoo Linux PCを最近更新しました。gppを5.4.0にアップグレードした後cppunitがstd :: bad_allocをスローする

gccに応じてすべてのパッケージを再コンパイルしました(gccのgccアップグレードガイドに記載されています)。

ほとんどのプログラムは正常に動作しますが、cppunitを使用してテストを行うと、起動前にstd :: bad_allocがスローされます。

最初はcppunitのアップデート版に問題があると思っていたので、以前のバージョンにダウングレードしましたが、まだ問題はあります。

私はすべてのテストを開始するたびに、アプリケーションはすぐにスロー:

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 

私はGDBと印刷されたデバッグバックトレースでアプリケーションを開始しました:、テストファイル自体に問題はありません

#0 0x00007ffff545d218 in raise() from /lib64/libc.so.6 
#1 0x00007ffff545e69a in abort() from /lib64/libc.so.6 
#2 0x00007ffff5d8f18d in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#3 0x00007ffff5d8d046 in ??() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#4 0x00007ffff5d8d091 in std::terminate()() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#5 0x00007ffff5d8d297 in __cxa_throw() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#6 0x00007ffff5db5f52 in std::__throw_bad_alloc()() from /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libstdc++.so.6 
#7 0x0000000000b2b3ae in __gnu_cxx::new_allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::allocate 
    (this=0x7fffffffda58, __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/ext/new_allocator.h:102 
#8 0x0000000000b2b1e2 in std::allocator_traits<std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::allocate (__a=..., __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/alloc_traits.h:491 
#9 0x0000000000b2b09e in std::__cxx1998::_Vector_base<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_allocate (this=0x7fffffffda58, 
    __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:170 
#10 0x0000000000b2af71 in std::__cxx1998::_Vector_base<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_create_storage (this=0x7fffffffda58, 
    __n=18446741874689290911) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:185 
#11 0x0000000000b2acf1 in std::__cxx1998::_Vector_base<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_Vector_base (this=0x7fffffffda58, 
    __n=18446741874689290911, __a=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:136 
#12 0x0000000000b29c9c in std::__cxx1998::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::vector (this=0x7fffffffda58, 
    __x=std::__cxx1998::vector of length -2199020260704, capacity -2199020259433 = {...}) at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/bits/stl_vector.h:320 
#13 0x0000000000b29449 in std::__debug::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::vector (this=0x7fffffffda40) 
    at /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/debug/vector:193 
#14 0x0000000000b294ef in CppUnit::TestSuiteBuilderContextBase::TestSuiteBuilderContextBase (this=0x7fffffffda20) at /usr/include/cppunit/extensions/TestSuiteBuilderContext.h:29 
#15 0x0000000000b29515 in CppUnit::TestSuiteBuilderContext<Types_Decimal>::TestSuiteBuilderContext (this=0x7fffffffda20, contextBase=...) at /usr/include/cppunit/extensions/TestSuiteBuilderContext.h:106 
#16 0x0000000000b28a16 in Types_Decimal::addTestsToSuite (baseContext=...) at ./Tests/../../pCpp/CppUnitTests/Types_Decimal.hpp:10 
#17 0x0000000000b28caa in Types_Decimal::suite() at ./Tests/../../pCpp/CppUnitTests/Types_Decimal.hpp:12 
#18 0x0000000000b2871f in main() at Types_Decimal.cpp:8 

ので、私はそれに変更を加えず、長い間テストを続けていました。

スタックトレースを調べた後、フレーム#12で何が起こったのかが気になります。__x=std::**__cxx1998**::vector of length **-2199020260704**, capacity **-2199020259433** = {...} なぜcxx1998があるのですか?長さと容量の両方がかなり狂っている(初期化されていない?)。

TestSuiteBuilderContext.h:29:

void 
TestSuiteBuilderContextBase::addTest(Test *test) 
{ 
    m_suite.addTest(test); //line 29 
} 

TestSuite.cpp:

/// Adds a test to the suite. 
void 
TestSuite::addTest(Test *test) 
{ 
    m_tests.push_back(test); 
} 
+0

ベクトルはかなり初期化され、維持されているので、スタックスマッシングアクションや不正なポインタによって悪い「this」やメモリが上書きされる可能性が高くなります。 – user4581301

答えて

0

私は部分的な解決策を思い付きました。

これは、コンパイルオプションのようになります。

-D_GLIBCXX_DEBUG 

が問題を引き起こしていました。それを取り除いた後、テストはうまくいっています。

+0

あなたの問題について2つの説明があります。 -D_GLIBCXX_DEBUGは、標準ライブラリとデバッグバージョンを交換するため、コンパイルされていないコードと互換性がありません。すべてのコードが-D_GLIBCXX_DEBUG(リンク先のすべてのC++ライブラリを含む)でコンパイルされている場合、オプションを削除するとほとんどの場合、問題が隠されます。デバッグライブラリには、問題を見つけるのに役立つ多くの追加の有用なチェックがあります。 – moggi

+0

cppunit自体はシステムパッケージとしてコンパイルされていたので、おそらくstlのデバッグバージョンはありませんでした。 – peku33

関連する問題