Collection CollectionFactory::createFromMap(const std::string& name,const DataMap& dm) const { if (!Collection::isNameValid(name)) { const std::string error = "invalid collection name"; throw std::invalid_argument(error); } Collection c(name,dm); dm.initDataCollection(&c,true); return c; }
每当执行throw语句时,我都会遇到分段错误.这是Valgrind输出的原因.我不知道发生了什么事.
==21124== Invalid read of size 1 ==21124== at 0x41D2190: parse_lsda_header(_Unwind_Context*,unsigned char const*,lsda_header_info*) (eh_personality.cc:62) ==21124== by 0x41D24A9: __gxx_personality_v0 (eh_personality.cc:228) ==21124== by 0x4200220: _Unwind_RaiseException (unwind.inc:109) ==21124== by 0x41D2C9C: __cxa_throw (eh_throw.cc:75) ==21124== by 0x4079BFB: corestore::CollectionFactory::createFromMap(std::string const&,corestore::DataMap const&) const (CollectionFactory.C:43) ==21124== by 0x8188F86: CollectionFactoryTest::testCreateNewFromMap_InvalidName() (CollectionFactoryTest.C:91) ==21124== by 0x81895D3: CppUnit::TestCaller<CollectionFactoryTest>::runTest() (TestCaller.h:166) ==21124== by 0x40D1BB5: CppUnit::TestCaseMethodFunctor::operator()() const (TestCase.cpp:34) ==21124== by 0x40C18E3: CppUnit::DefaultProtector::protect(CppUnit::Functor const&,CppUnit::ProtectorContext const&) (DefaultProtector.cpp:15) ==21124== by 0x40CD0FC: CppUnit::ProtectorChain::ProtectFunctor::operator()() const (ProtectorChain.cpp:20) ==21124== by 0x40CCA65: CppUnit::ProtectorChain::protect(CppUnit::Functor const&,CppUnit::ProtectorContext const&) (ProtectorChain.cpp:77) ==21124== by 0x40DC6C4: CppUnit::TestResult::protect(CppUnit::Functor const&,CppUnit::Test*,std::string const&) (TestResult.cpp:178) ==21124== Address 0xc82f is not stack'd,malloc'd or (recently) free'd
我已经进行了多次单元测试的重复轰炸,但是现在这是与其他所有相同的错误:
void CollectionFactoryTest::testCreateNewFromMap_InvalidName() { const char* MAP_FILE = "smallMapWithThreeSets.xml"; const char* NAME1 = "name/invalidname"; const char* NAME2 = "name/invalidname"; DataMapReader dmr; DataMap dm = dmr.getDataMapFromFile(MAP_FILE); CollectionFactory cf; try { cf.createFromMap(NAME1,dm); } catch (std::exception const& e) { std::cerr << e.what() << std::endl; } /*CPPUNIT_ASSERT_THROW(cf.createFromMap(NAME1,dm),std::invalid_argument); CPPUNIT_ASSERT_THROW(cf.createFromMap(NAME2,std::invalid_argument);*/ }
每个请求,isNameValid的内容:
bool Collection::isNameValid(const std::string& name) { /* can't be blank */ if(name.length() == 0) { return false; } /* Can't contain '/' */ if(name.find('/') != std::string::npos) { return false; } return true; }