Selaa lähdekoodia

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.
Bill Hoffman 11 vuotta sitten
vanhempi
sitoutus
5d40d88e00

+ 18 - 9
Source/CTest/cmCTestMemCheckHandler.cxx

@@ -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);
-  if ( ofile.empty() )
+  std::vector<std::string> files;
+  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
-cmCTestMemCheckHandler::TestOutputFileName(int test)
+void cmCTestMemCheckHandler::TestOutputFileNames(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);
 }
 }

+ 2 - 2
Source/CTest/cmCTestMemCheckHandler.h

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

+ 7 - 0
Tests/CTestTestMemcheck/testLeakSanitizer.cmake

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