123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #ifndef cmCTestMemCheckHandler_h
- #define cmCTestMemCheckHandler_h
- #include "cmConfigure.h" // IWYU pragma: keep
- #include "cmCTestTestHandler.h"
- #include <string>
- #include <vector>
- class cmMakefile;
- class cmXMLWriter;
- /** \class cmCTestMemCheckHandler
- * \brief A class that handles ctest -S invocations
- *
- */
- class cmCTestMemCheckHandler : public cmCTestTestHandler
- {
- friend class cmCTestRunTest;
- public:
- typedef cmCTestTestHandler Superclass;
- void PopulateCustomVectors(cmMakefile* mf) override;
- cmCTestMemCheckHandler();
- void Initialize() override;
- int GetDefectCount();
- protected:
- int PreProcessHandler() override;
- int PostProcessHandler() override;
- void GenerateTestCommand(std::vector<std::string>& args, int test) override;
- private:
- enum
- { // Memory checkers
- UNKNOWN = 0,
- VALGRIND,
- PURIFY,
- BOUNDS_CHECKER,
- // checkers after here do not use the standard error list
- ADDRESS_SANITIZER,
- LEAK_SANITIZER,
- THREAD_SANITIZER,
- MEMORY_SANITIZER,
- UB_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
- int DefectCount;
- 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(cmXMLWriter& xml) override;
- 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 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);
- };
- #endif
|