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;
}
जब भी फेंक कथन निष्पादित किया जाता है, तो मुझे सेगमेंटेशन गलती मिल रही है। Valgrind आउटपुट का कारण यहां दिया गया है। मुझे नहीं पता कि क्या हो रहा है।अपवाद फेंकने सेगमेंटेशन गलती
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);*/
}
अनुरोध के अनुसार, isNameValid की सामग्री:
==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
मैं इकाई परीक्षण बम विस्फोट है, लेकिन यहां इस बात का कई पुनरावृत्तियों लिया है वर्तमान एक है कि सभी दूसरों के रूप में ही बग दर्शाती है :
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;
}
सभी पिछली त्रुटियों में सिस्टम कॉल (सिग्नेशन, लिखना) या अनियमित मूल्यों पर सशर्त कूद में अनियमित मूल्य शामिल हैं, इसलिए ये स्मृति को दूषित नहीं कर रहे हैं। – Dave
क्या आप समस्या को कम कर सकते हैं? यदि आप केवल testCreateNewFromMap_InvalidName चलाते हैं तो क्या आपको अभी भी segfault मिलता है? –
मैंने एक अलग कार्यक्रम बनाया। यह सिर्फ मुख्य है। यह सब करता है कि उस परीक्षा में क्या था। वही विभाजन त्रुटि होती है। मैंने एक अलग कार्यक्रम भी बनाया जो सिर्फ अपवाद फेंकता है (मेरी लाइब्रेरी का उपयोग नहीं करता है), और यह काम करता है। इसके अलावा, अगर मुझे पकड़ नहीं है, तो मुझे "निरस्त" के प्रिंट आउट के साथ एक साफ निकास मिलता है। – Dave