2016-09-27 22:01:08 +03:00
|
|
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
2005-01-27 23:54:47 +03:00
|
|
|
#ifndef cmCTestMemCheckHandler_h
|
|
|
|
#define cmCTestMemCheckHandler_h
|
|
|
|
|
2016-08-24 23:01:40 +03:00
|
|
|
#include <cmConfigure.h>
|
|
|
|
|
2005-01-27 23:54:47 +03:00
|
|
|
#include "cmCTestTestHandler.h"
|
2016-08-24 23:01:40 +03:00
|
|
|
#include "cmTypeMacro.h"
|
2016-04-29 16:40:20 +03:00
|
|
|
|
2014-07-07 23:58:02 +04:00
|
|
|
#include <string>
|
2016-04-29 17:53:13 +03:00
|
|
|
#include <vector>
|
2005-01-27 23:54:47 +03:00
|
|
|
|
|
|
|
class cmMakefile;
|
2015-05-24 21:40:47 +03:00
|
|
|
class cmXMLWriter;
|
2005-01-27 23:54:47 +03:00
|
|
|
|
|
|
|
/** \class cmCTestMemCheckHandler
|
|
|
|
* \brief A class that handles ctest -S invocations
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
class cmCTestMemCheckHandler : public cmCTestTestHandler
|
|
|
|
{
|
2009-08-28 23:08:03 +04:00
|
|
|
friend class cmCTestRunTest;
|
2016-05-16 17:34:04 +03:00
|
|
|
|
2005-01-27 23:54:47 +03:00
|
|
|
public:
|
2005-06-17 21:04:56 +04:00
|
|
|
cmTypeMacro(cmCTestMemCheckHandler, cmCTestTestHandler);
|
|
|
|
|
2016-06-27 22:25:27 +03:00
|
|
|
void PopulateCustomVectors(cmMakefile* mf) CM_OVERRIDE;
|
2012-08-13 21:42:58 +04:00
|
|
|
|
2005-01-27 23:54:47 +03:00
|
|
|
cmCTestMemCheckHandler();
|
|
|
|
|
2016-06-27 22:25:27 +03:00
|
|
|
void Initialize() CM_OVERRIDE;
|
2016-05-16 17:34:04 +03:00
|
|
|
|
2005-01-27 23:54:47 +03:00
|
|
|
protected:
|
2016-06-27 22:25:27 +03:00
|
|
|
int PreProcessHandler() CM_OVERRIDE;
|
|
|
|
int PostProcessHandler() CM_OVERRIDE;
|
|
|
|
void GenerateTestCommand(std::vector<std::string>& args,
|
|
|
|
int test) CM_OVERRIDE;
|
2005-01-27 23:54:47 +03:00
|
|
|
|
|
|
|
private:
|
2016-05-16 17:34:04 +03:00
|
|
|
enum
|
|
|
|
{ // Memory checkers
|
2005-01-27 23:54:47 +03:00
|
|
|
UNKNOWN = 0,
|
|
|
|
VALGRIND,
|
|
|
|
PURIFY,
|
2014-07-07 23:58:02 +04:00
|
|
|
BOUNDS_CHECKER,
|
2014-10-03 21:42:43 +04:00
|
|
|
// checkers after here do not use the standard error list
|
2014-10-07 23:14:20 +04:00
|
|
|
ADDRESS_SANITIZER,
|
2014-10-03 21:46:18 +04:00
|
|
|
THREAD_SANITIZER,
|
2014-10-07 19:34:53 +04:00
|
|
|
MEMORY_SANITIZER,
|
2014-10-03 21:46:18 +04:00
|
|
|
UB_SANITIZER
|
2005-01-27 23:54:47 +03:00
|
|
|
};
|
2016-05-16 17:34:04 +03:00
|
|
|
|
2007-07-24 22:43:31 +04:00
|
|
|
public:
|
2016-05-16 17:34:04 +03:00
|
|
|
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
|
|
|
|
};
|
2016-05-16 17:34:04 +03:00
|
|
|
|
2007-07-24 22:43:31 +04:00
|
|
|
private:
|
2016-05-16 17:34:04 +03:00
|
|
|
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
|
|
|
|
};
|
2016-05-16 17:34:04 +03:00
|
|
|
std::string BoundsCheckerDPBDFile;
|
|
|
|
std::string BoundsCheckerXMLFile;
|
|
|
|
std::string MemoryTester;
|
2014-02-10 09:21:34 +04:00
|
|
|
std::vector<std::string> MemoryTesterDynamicOptions;
|
|
|
|
std::vector<std::string> MemoryTesterOptions;
|
2016-05-16 17:34:04 +03:00
|
|
|
int MemoryTesterStyle;
|
|
|
|
std::string MemoryTesterOutputFile;
|
|
|
|
std::string MemoryTesterEnvironmentVariable;
|
2014-07-07 23:58:02 +04:00
|
|
|
// these are used to store the types of errors that can show up
|
|
|
|
std::vector<std::string> ResultStrings;
|
|
|
|
std::vector<std::string> ResultStringsLong;
|
2016-05-16 17:34:04 +03:00
|
|
|
std::vector<int> GlobalResults;
|
|
|
|
bool LogWithPID; // does log file add pid
|
2014-07-07 23:58:02 +04:00
|
|
|
|
|
|
|
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
|
|
|
|
*/
|
2016-06-27 22:25:27 +03:00
|
|
|
void GenerateDartOutput(cmXMLWriter& xml) CM_OVERRIDE;
|
2005-01-27 23:54:47 +03:00
|
|
|
|
2014-02-10 09:21:34 +04: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
|
2016-05-16 17:34:04 +03:00
|
|
|
// 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,
|
2014-07-07 23:58:02 +04:00
|
|
|
std::vector<int>& results);
|
2016-05-16 17:34:04 +03:00
|
|
|
bool ProcessMemCheckPurifyOutput(const std::string& str, std::string& log,
|
2014-07-07 23:58:02 +04:00
|
|
|
std::vector<int>& results);
|
2016-05-16 17:34:04 +03:00
|
|
|
bool ProcessMemCheckSanitizerOutput(const std::string& str, std::string& log,
|
2014-07-15 01:01:47 +04:00
|
|
|
std::vector<int>& results);
|
2012-08-13 21:42:58 +04:00
|
|
|
bool ProcessMemCheckBoundsCheckerOutput(const std::string& str,
|
2014-07-07 23:58:02 +04:00
|
|
|
std::string& log,
|
|
|
|
std::vector<int>& results);
|
2009-08-28 23:08:03 +04:00
|
|
|
|
2014-07-07 23:58:02 +04:00
|
|
|
void PostProcessTest(cmCTestTestResult& res, int test);
|
2013-08-08 00:25:48 +04:00
|
|
|
void PostProcessBoundsCheckerTest(cmCTestTestResult& res, int test);
|
2013-05-04 21:03:26 +04:00
|
|
|
|
|
|
|
///! append MemoryTesterOutputFile to the test log
|
2014-06-24 21:49:05 +04:00
|
|
|
void AppendMemTesterOutput(cmCTestTestHandler::cmCTestTestResult& res,
|
2014-07-24 19:25:59 +04:00
|
|
|
std::string const& filename);
|
2013-08-08 00:25:48 +04:00
|
|
|
|
|
|
|
///! generate the output filename for the given test index
|
2014-07-24 19:25:59 +04:00
|
|
|
void TestOutputFileNames(int test, std::vector<std::string>& files);
|
2005-01-27 23:54:47 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|