#pragma once
#include "cmConfigure.h"
#include <string>
#include <vector>
#include "cmCTestTestHandler.h"
class cmCTest;
class cmCTestMemCheckHandler : public cmCTestTestHandler
{
friend class cmCTestRunTest;
public:
using Superclass = cmCTestTestHandler;
void PopulateCustomVectors(cmMakefile* mf) override;
cmCTestMemCheckHandler(cmCTest* ctest);
int GetDefectCount() const;
protected:
int PreProcessHandler() override;
int PostProcessHandler() override;
void GenerateTestCommand(std::vector<std::string>& args, int test) override;
private:
enum
{
UNKNOWN = 0,
VALGRIND,
PURIFY,
DRMEMORY,
BOUNDS_CHECKER,
CUDA_SANITIZER,
ADDRESS_SANITIZER,
LEAK_SANITIZER,
THREAD_SANITIZER,
MEMORY_SANITIZER,
UB_SANITIZER
};
public:
enum
{
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
{
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 = UNKNOWN;
std::string MemoryTesterOutputFile;
std::string MemoryTesterEnvironmentVariable;
std::vector<std::string> ResultStrings;
std::vector<std::string> ResultStringsLong;
std::vector<int> GlobalResults;
bool LogWithPID = false;
int DefectCount = 0;
std::vector<int>::size_type FindOrAddWarning(std::string const& warning);
void InitializeResultsVectors();
bool InitializeMemoryChecking();
void GenerateCTestXML(cmXMLWriter& xml) override;
std::vector<std::string> CustomPreMemCheck;
std::vector<std::string> CustomPostMemCheck;
bool ProcessMemCheckOutput(std::string const& str, std::string& log,
std::vector<int>& results);
bool ProcessMemCheckValgrindOutput(std::string const& str, std::string& log,
std::vector<int>& results);
bool ProcessMemCheckDrMemoryOutput(std::string const& str, std::string& log,
std::vector<int>& results);
bool ProcessMemCheckPurifyOutput(std::string const& str, std::string& log,
std::vector<int>& results);
bool ProcessMemCheckCudaOutput(std::string const& str, std::string& log,
std::vector<int>& results);
bool ProcessMemCheckSanitizerOutput(std::string const& str, std::string& log,
std::vector<int>& results);
bool ProcessMemCheckBoundsCheckerOutput(std::string const& str,
std::string& log,
std::vector<int>& results);
void PostProcessTest(cmCTestTestResult& res, int test);
void PostProcessBoundsCheckerTest(cmCTestTestResult& res, int test);
void PostProcessDrMemoryTest(cmCTestTestResult& res, int test);
void AppendMemTesterOutput(cmCTestTestHandler::cmCTestTestResult& res,
std::string const& filename);
void TestOutputFileNames(int test, std::vector<std::string>& files);
};