فهرست منبع

ctest: add support for additional sanitizer options

Sanitizers receive options through their environment variable; support
user-specified options here.
Ben Boeckel 11 سال پیش
والد
کامیت
ca9cc25ce8

+ 1 - 0
Help/manual/cmake-variables.7.rst

@@ -351,6 +351,7 @@ Variables for CTest
    /variable/CTEST_HG_UPDATE_OPTIONS
    /variable/CTEST_MEMORYCHECK_COMMAND
    /variable/CTEST_MEMORYCHECK_COMMAND_OPTIONS
+   /variable/CTEST_MEMORYCHECK_SANITIZER_OPTIONS
    /variable/CTEST_MEMORYCHECK_SUPPRESSIONS_FILE
    /variable/CTEST_MEMORYCHECK_TYPE
    /variable/CTEST_NIGHTLY_START_TIME

+ 6 - 0
Help/manual/ctest.1.rst

@@ -830,6 +830,12 @@ Configuration settings include:
   * `CTest Script`_ variable: :variable:`CTEST_MEMORYCHECK_TYPE`
   * :module:`CTest` module variable: ``MEMORYCHECK_TYPE``
 
+``MemoryCheckSanitizerOptions``
+  Specify options to sanitizers when running with a sanitize-enabled build.
+
+  * `CTest Script`_ variable: :variable:`CTEST_MEMORYCHECK_SANITIZER_OPTIONS`
+  * :module:`CTest` module variable: ``MEMORYCHECK_SANITIZER_OPTIONS``
+
 ``MemoryCheckSuppressionFile``
   Specify a file containing suppression rules for the
   ``MemoryCheckCommand`` tool.  It will be passed with options

+ 5 - 0
Help/variable/CTEST_MEMORYCHECK_SANITIZER_OPTIONS.rst

@@ -0,0 +1,5 @@
+CTEST_MEMORYCHECK_SANITIZER_OPTIONS
+-----------------------------------
+
+Specify the CTest ``MemoryCheckSanitizerOptions`` setting
+in a :manual:`ctest(1)` dashboard client script.

+ 1 - 0
Modules/DartConfiguration.tcl.in

@@ -75,6 +75,7 @@ PurifyCommand: @PURIFYCOMMAND@
 ValgrindCommand: @VALGRIND_COMMAND@
 ValgrindCommandOptions: @VALGRIND_COMMAND_OPTIONS@
 MemoryCheckType: @MEMORYCHECK_TYPE@
+MemoryCheckSanitizerOptions: @MEMORYCHECK_SANITIZER_OPTIONS@
 MemoryCheckCommand: @MEMORYCHECK_COMMAND@
 MemoryCheckCommandOptions: @MEMORYCHECK_COMMAND_OPTIONS@
 MemoryCheckSuppressionFile: @MEMORYCHECK_SUPPRESSIONS_FILE@

+ 2 - 0
Source/CTest/cmCTestMemCheckCommand.cxx

@@ -22,6 +22,8 @@ cmCTestGenericHandler* cmCTestMemCheckCommand::InitializeActualHandler()
 
   this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile,
     "MemoryCheckType", "CTEST_MEMORYCHECK_TYPE");
+  this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile,
+    "MemoryCheckSanitizerOptions", "CTEST_MEMORYCHECK_SANITIZER_OPTIONS");
   this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile,
     "MemoryCheckCommand", "CTEST_MEMORYCHECK_COMMAND");
   this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile,

+ 11 - 5
Source/CTest/cmCTestMemCheckHandler.cxx

@@ -686,15 +686,21 @@ bool cmCTestMemCheckHandler::InitializeMemoryChecking()
       // TSAN_OPTIONS string with the log_path in it.
       this->MemoryTesterDynamicOptions.push_back("-E");
       this->MemoryTesterDynamicOptions.push_back("env");
-      std::string envVar = "TSAN_OPTIONS";
-      std::string extraOptions;
-      if(this->MemoryTesterStyle == cmCTestMemCheckHandler::ADDRESS_SANITIZER)
+      std::string envVar;
+      std::string extraOptions =
+        this->CTest->GetCTestConfiguration("MemoryCheckSanitizerOptions");
+      if(this->MemoryTesterStyle == cmCTestMemCheckHandler::THREAD_SANITIZER)
+        {
+        envVar = "TSAN_OPTIONS";
+        }
+      else if(this->MemoryTesterStyle ==
+                cmCTestMemCheckHandler::ADDRESS_SANITIZER)
         {
         envVar = "ASAN_OPTIONS";
-        extraOptions = " detect_leaks=1";
+        extraOptions += " detect_leaks=1";
         }
       std::string outputFile = envVar + "=log_path=\""
-        + this->MemoryTesterOutputFile + "\"";
+        + this->MemoryTesterOutputFile + "\" ";
       this->MemoryTesterEnvironmentVariable = outputFile + extraOptions;
       break;
       }