49948f7221
This commit adds support for ThreadSanitizer to ctest. ThreadSanitizer is part of the clang compiler and also gcc 4.8 and later. You have to compile the code with special flags. Then your code gets the the ThreadSanitizer ability built into it. To pass options to the ThreadSanitizer you use an environment variable. This commit teaches ctest to parse the output from ThreadSanitizer and send it to CDash.
155 lines
4.4 KiB
C++
155 lines
4.4 KiB
C++
/*============================================================================
|
|
CMake - Cross Platform Makefile Generator
|
|
Copyright 2000-2009 Kitware, Inc.
|
|
|
|
Distributed under the OSI-approved BSD License (the "License");
|
|
see accompanying file Copyright.txt for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the License for more information.
|
|
============================================================================*/
|
|
|
|
#ifndef cmCTestMemCheckHandler_h
|
|
#define cmCTestMemCheckHandler_h
|
|
|
|
|
|
#include "cmCTestTestHandler.h"
|
|
#include "cmStandardIncludes.h"
|
|
#include "cmListFileCache.h"
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
class cmMakefile;
|
|
|
|
/** \class cmCTestMemCheckHandler
|
|
* \brief A class that handles ctest -S invocations
|
|
*
|
|
*/
|
|
class cmCTestMemCheckHandler : public cmCTestTestHandler
|
|
{
|
|
friend class cmCTestRunTest;
|
|
public:
|
|
cmTypeMacro(cmCTestMemCheckHandler, cmCTestTestHandler);
|
|
|
|
void PopulateCustomVectors(cmMakefile *mf);
|
|
|
|
cmCTestMemCheckHandler();
|
|
|
|
void Initialize();
|
|
protected:
|
|
virtual int PreProcessHandler();
|
|
virtual int PostProcessHandler();
|
|
virtual void GenerateTestCommand(std::vector<std::string>& args, int test);
|
|
|
|
private:
|
|
|
|
enum { // Memory checkers
|
|
UNKNOWN = 0,
|
|
VALGRIND,
|
|
PURIFY,
|
|
BOUNDS_CHECKER,
|
|
// checkers after hear do not use the standard error list
|
|
THREAD_SANITIZER
|
|
};
|
|
public:
|
|
enum { // Memory faults
|
|
ABR = 0,
|
|
ABW,
|
|
ABWL,
|
|
COR,
|
|
EXU,
|
|
FFM,
|
|
FIM,
|
|
FMM,
|
|
FMR,
|
|
FMW,
|
|
FUM,
|
|
IPR,
|
|
IPW,
|
|
MAF,
|
|
MLK,
|
|
MPK,
|
|
NPR,
|
|
ODS,
|
|
PAR,
|
|
PLK,
|
|
UMC,
|
|
UMR,
|
|
NO_MEMORY_FAULT
|
|
};
|
|
private:
|
|
enum { // Program statuses
|
|
NOT_RUN = 0,
|
|
TIMEOUT,
|
|
SEGFAULT,
|
|
ILLEGAL,
|
|
INTERRUPT,
|
|
NUMERICAL,
|
|
OTHER_FAULT,
|
|
FAILED,
|
|
BAD_COMMAND,
|
|
COMPLETED
|
|
};
|
|
std::string BoundsCheckerDPBDFile;
|
|
std::string BoundsCheckerXMLFile;
|
|
std::string MemoryTester;
|
|
std::vector<std::string> MemoryTesterDynamicOptions;
|
|
std::vector<std::string> MemoryTesterOptions;
|
|
int MemoryTesterStyle;
|
|
std::string MemoryTesterOutputFile;
|
|
std::string MemoryTesterEnvironmentVariable;
|
|
// these are used to store the types of errors that can show up
|
|
std::vector<std::string> ResultStrings;
|
|
std::vector<std::string> ResultStringsLong;
|
|
std::vector<int> GlobalResults;
|
|
bool LogWithPID; // does log file add pid
|
|
|
|
std::vector<int>::size_type FindOrAddWarning(const std::string& warning);
|
|
// initialize the ResultStrings and ResultStringsLong for
|
|
// this type of checker
|
|
void InitializeResultsVectors();
|
|
|
|
///! Initialize memory checking subsystem.
|
|
bool InitializeMemoryChecking();
|
|
|
|
/**
|
|
* Generate the Dart compatible output
|
|
*/
|
|
void GenerateDartOutput(std::ostream& os);
|
|
|
|
std::vector<std::string> CustomPreMemCheck;
|
|
std::vector<std::string> CustomPostMemCheck;
|
|
|
|
//! Parse Valgrind/Purify/Bounds Checker result out of the output
|
|
//string. After running, log holds the output and results hold the
|
|
//different memmory errors.
|
|
bool ProcessMemCheckOutput(const std::string& str,
|
|
std::string& log, std::vector<int>& results);
|
|
bool ProcessMemCheckValgrindOutput(const std::string& str,
|
|
std::string& log,
|
|
std::vector<int>& results);
|
|
bool ProcessMemCheckPurifyOutput(const std::string& str,
|
|
std::string& log,
|
|
std::vector<int>& results);
|
|
bool ProcessMemCheckThreadSanitizerOutput(const std::string& str,
|
|
std::string& log,
|
|
std::vector<int>& results);
|
|
bool ProcessMemCheckBoundsCheckerOutput(const std::string& str,
|
|
std::string& log,
|
|
std::vector<int>& results);
|
|
|
|
void PostProcessTest(cmCTestTestResult& res, int test);
|
|
void PostProcessBoundsCheckerTest(cmCTestTestResult& res, int test);
|
|
|
|
///! append MemoryTesterOutputFile to the test log
|
|
void AppendMemTesterOutput(cmCTestTestHandler::cmCTestTestResult& res,
|
|
int test);
|
|
|
|
///! generate the output filename for the given test index
|
|
std::string TestOutputFileName(int test);
|
|
};
|
|
|
|
#endif
|
|
|