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;
}
Bất cứ khi nào câu lệnh ném được thực thi, tôi nhận được lỗi phân đoạn. Đây là nguyên nhân từ đầu ra Valgrind. Tôi không biết chuyện gì đang diễn ra.ném một ngoại lệ gây ra lỗi phân đoạn
==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
tôi đã có một số lần lặp của bài kiểm tra đơn vị đó là vụ đánh bom, nhưng đây là một hiện rằng cuộc triển lãm các lỗi giống như tất cả những người khác:
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, dm), std::invalid_argument);*/
}
Theo yêu cầu, nội dung của 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;
}
Tất cả các lỗi trước đó liên quan đến giá trị chưa được khởi tạo trong cuộc gọi hệ thống (sigaction, write) hoặc nhảy có điều kiện về giá trị chưa được khởi tạo, vì vậy đây không phải là bộ nhớ bị hỏng. – Dave
Bạn có thể giảm bớt sự cố không? Nếu bạn chỉ chạy testCreateNewFromMap_InvalidName bạn vẫn nhận được segfault? –
Tôi đã tạo một chương trình riêng. Nó chỉ là chính. Tất cả những gì có trong bài kiểm tra đó. Lỗi phân đoạn giống nhau xảy ra. Tôi cũng tạo ra một chương trình riêng biệt mà chỉ ném một ngoại lệ (không sử dụng thư viện của tôi), và nó hoạt động. Ngoài ra, nếu tôi không bắt được, tôi sẽ có lối ra sạch sẽ với một bản in ra khỏi "Bị hủy bỏ". – Dave