CMake/Source/CTest/cmCTestMemCheckHandler.h

160 lines
4.3 KiB
C
Raw Normal View History

/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2000-2009 Kitware, Inc.
2005-01-27 23:54:47 +03:00
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
2005-01-27 23:54:47 +03:00
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.
============================================================================*/
2005-01-27 23:54:47 +03:00
#ifndef cmCTestMemCheckHandler_h
#define cmCTestMemCheckHandler_h
#include "cmCTestTestHandler.h"
2005-01-27 23:54:47 +03:00
#include "cmListFileCache.h"
#include <string>
#include <vector>
2005-01-27 23:54:47 +03:00
class cmMakefile;
class cmXMLWriter;
2005-01-27 23:54:47 +03:00
/** \class cmCTestMemCheckHandler
* \brief A class that handles ctest -S invocations
*
*/
class cmCTestMemCheckHandler : public cmCTestTestHandler
{
friend class cmCTestRunTest;
2005-01-27 23:54:47 +03:00
public:
cmTypeMacro(cmCTestMemCheckHandler, cmCTestTestHandler);
void PopulateCustomVectors(cmMakefile* mf);
2005-01-27 23:54:47 +03:00
cmCTestMemCheckHandler();
void Initialize();
2005-01-27 23:54:47 +03:00
protected:
virtual int PreProcessHandler();
virtual int PostProcessHandler();
virtual void GenerateTestCommand(std::vector<std::string>& args, int test);
2005-01-27 23:54:47 +03:00
private:
enum
{ // Memory checkers
2005-01-27 23:54:47 +03:00
UNKNOWN = 0,
VALGRIND,
PURIFY,
BOUNDS_CHECKER,
// checkers after here do not use the standard error list
ADDRESS_SANITIZER,
THREAD_SANITIZER,
MEMORY_SANITIZER,
UB_SANITIZER
2005-01-27 23:54:47 +03:00
};
2007-07-24 22:43:31 +04:00
public:
enum
{ // Memory faults
2005-01-27 23:54:47 +03:00
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
};
2007-07-24 22:43:31 +04:00
private:
enum
{ // Program statuses
2005-01-27 23:54:47 +03:00
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();
2005-01-27 23:54:47 +03:00
///! Initialize memory checking subsystem.
bool InitializeMemoryChecking();
/**
* Generate the Dart compatible output
*/
void GenerateDartOutput(cmXMLWriter& xml);
2005-01-27 23:54:47 +03:00
std::vector<std::string> CustomPreMemCheck;
std::vector<std::string> CustomPostMemCheck;
2005-01-27 23:54:47 +03:00
//! 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 ProcessMemCheckSanitizerOutput(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,
std::string const& filename);
///! generate the output filename for the given test index
void TestOutputFileNames(int test, std::vector<std::string>& files);
2005-01-27 23:54:47 +03:00
};
#endif