Handle more than one process with sanitizer errors.
Since the Sanitizers write out one log file per process, a single test might have more than one log file. This commit allows ctest to read all of the log files found for a particual test.
This commit is contained in:
parent
afe21fc3c4
commit
5d40d88e00
|
@ -1127,7 +1127,13 @@ cmCTestMemCheckHandler::PostProcessTest(cmCTestTestResult& res,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this->AppendMemTesterOutput(res, test);
|
std::vector<std::string> files;
|
||||||
|
this->TestOutputFileNames(test, files);
|
||||||
|
for(std::vector<std::string>::iterator i = files.begin();
|
||||||
|
i != files.end(); ++i)
|
||||||
|
{
|
||||||
|
this->AppendMemTesterOutput(res, *i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1141,11 +1147,13 @@ cmCTestMemCheckHandler::PostProcessBoundsCheckerTest(cmCTestTestResult& res,
|
||||||
cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
|
cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
|
||||||
"PostProcessBoundsCheckerTest for : "
|
"PostProcessBoundsCheckerTest for : "
|
||||||
<< res.Name << std::endl);
|
<< res.Name << std::endl);
|
||||||
std::string ofile = this->TestOutputFileName(test);
|
std::vector<std::string> files;
|
||||||
if ( ofile.empty() )
|
this->TestOutputFileNames(test, files);
|
||||||
|
if ( files.size() == 0 )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
std::string ofile = files[0];
|
||||||
// put a scope around this to close ifs so the file can be removed
|
// put a scope around this to close ifs so the file can be removed
|
||||||
{
|
{
|
||||||
cmsys::ifstream ifs(ofile.c_str());
|
cmsys::ifstream ifs(ofile.c_str());
|
||||||
|
@ -1175,9 +1183,8 @@ cmCTestMemCheckHandler::PostProcessBoundsCheckerTest(cmCTestTestResult& res,
|
||||||
|
|
||||||
void
|
void
|
||||||
cmCTestMemCheckHandler::AppendMemTesterOutput(cmCTestTestResult& res,
|
cmCTestMemCheckHandler::AppendMemTesterOutput(cmCTestTestResult& res,
|
||||||
int test)
|
std::string const& ofile)
|
||||||
{
|
{
|
||||||
std::string ofile = this->TestOutputFileName(test);
|
|
||||||
if ( ofile.empty() )
|
if ( ofile.empty() )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -1205,8 +1212,9 @@ cmCTestMemCheckHandler::AppendMemTesterOutput(cmCTestTestResult& res,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
void cmCTestMemCheckHandler::TestOutputFileNames(int test,
|
||||||
cmCTestMemCheckHandler::TestOutputFileName(int test)
|
std::vector<std::string>&
|
||||||
|
files)
|
||||||
{
|
{
|
||||||
std::string index;
|
std::string index;
|
||||||
cmOStringStream stream;
|
cmOStringStream stream;
|
||||||
|
@ -1229,7 +1237,8 @@ cmCTestMemCheckHandler::TestOutputFileName(int test)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ofile = g.GetFiles()[0];
|
files = g.GetFiles();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( !cmSystemTools::FileExists(ofile.c_str()) )
|
else if ( !cmSystemTools::FileExists(ofile.c_str()) )
|
||||||
|
@ -1239,5 +1248,5 @@ cmCTestMemCheckHandler::TestOutputFileName(int test)
|
||||||
cmCTestLog(this->CTest, ERROR_MESSAGE, log.c_str() << std::endl);
|
cmCTestLog(this->CTest, ERROR_MESSAGE, log.c_str() << std::endl);
|
||||||
ofile = "";
|
ofile = "";
|
||||||
}
|
}
|
||||||
return ofile;
|
files.push_back(ofile);
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,10 +145,10 @@ private:
|
||||||
|
|
||||||
///! append MemoryTesterOutputFile to the test log
|
///! append MemoryTesterOutputFile to the test log
|
||||||
void AppendMemTesterOutput(cmCTestTestHandler::cmCTestTestResult& res,
|
void AppendMemTesterOutput(cmCTestTestHandler::cmCTestTestResult& res,
|
||||||
int test);
|
std::string const& filename);
|
||||||
|
|
||||||
///! generate the output filename for the given test index
|
///! generate the output filename for the given test index
|
||||||
std::string TestOutputFileName(int test);
|
void TestOutputFileNames(int test, std::vector<std::string>& files);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,6 +11,7 @@ endif()
|
||||||
|
|
||||||
# clear the log file
|
# clear the log file
|
||||||
file(REMOVE "${LOG_FILE}.2343")
|
file(REMOVE "${LOG_FILE}.2343")
|
||||||
|
file(REMOVE "${LOG_FILE}.2344")
|
||||||
|
|
||||||
# create an error of each type of thread santizer
|
# create an error of each type of thread santizer
|
||||||
# these names come from tsan_report.cc in llvm
|
# these names come from tsan_report.cc in llvm
|
||||||
|
@ -24,6 +25,12 @@ Direct leak of 4360 byte(s) in 1 object(s) allocated from:
|
||||||
#1 0x4823b4 in main /home/kitware/msan/memcheck.cxx:12
|
#1 0x4823b4 in main /home/kitware/msan/memcheck.cxx:12
|
||||||
#2 0x7fa72bee476c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
|
#2 0x7fa72bee476c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226
|
||||||
|
|
||||||
|
SUMMARY: AddressSanitizer: 4436 byte(s) leaked in 2 allocation(s).
|
||||||
|
")
|
||||||
|
file(APPEND "${LOG_FILE}.2342"
|
||||||
|
"=================================================================
|
||||||
|
==25308==ERROR: LeakSanitizer: detected memory leaks
|
||||||
|
|
||||||
Direct leak of 76 byte(s) in 1 object(s) allocated from:
|
Direct leak of 76 byte(s) in 1 object(s) allocated from:
|
||||||
#0 0x46c669 in operator new[](unsigned long) (/home/kitware/msan/a.out+0x46c669)
|
#0 0x46c669 in operator new[](unsigned long) (/home/kitware/msan/a.out+0x46c669)
|
||||||
#1 0x4821b8 in foo() /home/kitware/msan/memcheck.cxx:4
|
#1 0x4821b8 in foo() /home/kitware/msan/memcheck.cxx:4
|
||||||
|
|
Loading…
Reference in New Issue