From 5d40d88e0026824e237938a9e771206220857034 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Thu, 24 Jul 2014 11:25:59 -0400 Subject: [PATCH] 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. --- Source/CTest/cmCTestMemCheckHandler.cxx | 27 ++++++++++++------- Source/CTest/cmCTestMemCheckHandler.h | 4 +-- .../CTestTestMemcheck/testLeakSanitizer.cmake | 7 +++++ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Source/CTest/cmCTestMemCheckHandler.cxx b/Source/CTest/cmCTestMemCheckHandler.cxx index ed57949bd..ced79825b 100644 --- a/Source/CTest/cmCTestMemCheckHandler.cxx +++ b/Source/CTest/cmCTestMemCheckHandler.cxx @@ -1127,7 +1127,13 @@ cmCTestMemCheckHandler::PostProcessTest(cmCTestTestResult& res, } else { - this->AppendMemTesterOutput(res, test); + std::vector files; + this->TestOutputFileNames(test, files); + for(std::vector::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, "PostProcessBoundsCheckerTest for : " << res.Name << std::endl); - std::string ofile = this->TestOutputFileName(test); - if ( ofile.empty() ) + std::vector files; + this->TestOutputFileNames(test, files); + if ( files.size() == 0 ) { return; } + std::string ofile = files[0]; // put a scope around this to close ifs so the file can be removed { cmsys::ifstream ifs(ofile.c_str()); @@ -1175,9 +1183,8 @@ cmCTestMemCheckHandler::PostProcessBoundsCheckerTest(cmCTestTestResult& res, void cmCTestMemCheckHandler::AppendMemTesterOutput(cmCTestTestResult& res, - int test) + std::string const& ofile) { - std::string ofile = this->TestOutputFileName(test); if ( ofile.empty() ) { return; @@ -1205,8 +1212,9 @@ cmCTestMemCheckHandler::AppendMemTesterOutput(cmCTestTestResult& res, } } -std::string -cmCTestMemCheckHandler::TestOutputFileName(int test) +void cmCTestMemCheckHandler::TestOutputFileNames(int test, + std::vector& + files) { std::string index; cmOStringStream stream; @@ -1229,7 +1237,8 @@ cmCTestMemCheckHandler::TestOutputFileName(int test) } else { - ofile = g.GetFiles()[0]; + files = g.GetFiles(); + return; } } 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); ofile = ""; } - return ofile; + files.push_back(ofile); } diff --git a/Source/CTest/cmCTestMemCheckHandler.h b/Source/CTest/cmCTestMemCheckHandler.h index 2630fde4b..2195dabe2 100644 --- a/Source/CTest/cmCTestMemCheckHandler.h +++ b/Source/CTest/cmCTestMemCheckHandler.h @@ -145,10 +145,10 @@ private: ///! append MemoryTesterOutputFile to the test log void AppendMemTesterOutput(cmCTestTestHandler::cmCTestTestResult& res, - int test); + std::string const& filename); ///! generate the output filename for the given test index - std::string TestOutputFileName(int test); + void TestOutputFileNames(int test, std::vector& files); }; #endif diff --git a/Tests/CTestTestMemcheck/testLeakSanitizer.cmake b/Tests/CTestTestMemcheck/testLeakSanitizer.cmake index d0e38cee0..02030be87 100644 --- a/Tests/CTestTestMemcheck/testLeakSanitizer.cmake +++ b/Tests/CTestTestMemcheck/testLeakSanitizer.cmake @@ -11,6 +11,7 @@ endif() # clear the log file file(REMOVE "${LOG_FILE}.2343") +file(REMOVE "${LOG_FILE}.2344") # create an error of each type of thread santizer # 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 #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: #0 0x46c669 in operator new[](unsigned long) (/home/kitware/msan/a.out+0x46c669) #1 0x4821b8 in foo() /home/kitware/msan/memcheck.cxx:4