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:
Bill Hoffman 2014-07-24 11:25:59 -04:00
parent afe21fc3c4
commit 5d40d88e00
3 changed files with 27 additions and 11 deletions

View File

@ -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);
} }

View File

@ -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

View File

@ -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