diff --git a/src/experiments/generic-experiment/experiment.cc b/src/experiments/generic-experiment/experiment.cc index b590c750..54b5278f 100644 --- a/src/experiments/generic-experiment/experiment.cc +++ b/src/experiments/generic-experiment/experiment.cc @@ -176,6 +176,14 @@ bool GenericExperiment::cb_start_experiment() { m_log << "enabled logging on port E9 for SDC-detection" << std::endl; enabled_e9_sol = true; e9_file = std::string(cmd[E9_FILE].first()->arg); + e9_goldenrun = loadFile(e9_file); + + // Limit the serial-output logger buffer to prevent overly large memory + // consumption in case the target system ends up, e.g., in an endless + // loop. "+ 1" to be able to detect the case when the target system + // makes a correct output but faultily adds extra characters + // afterwards. + e9_sol.setLimit(e9_goldenrun.size() + 1); } if (cmd[WRITE_MEM_TEXT]) { @@ -290,7 +298,6 @@ void GenericExperiment::cb_after_resume(fail::BaseListener *event) { // check experiment's data for SDC if (enabled_e9_sol) { // compare golden run to experiment - std::vector e9_goldenrun = loadFile(e9_file); std::string e9_experiment = e9_sol.getOutput(); if ( ! (e9_experiment.size() == e9_goldenrun.size() && equal(e9_experiment.begin(), e9_experiment.end(), e9_goldenrun.begin())) ) { diff --git a/src/experiments/generic-experiment/experiment.hpp b/src/experiments/generic-experiment/experiment.hpp index 81358b0a..ef6218e4 100644 --- a/src/experiments/generic-experiment/experiment.hpp +++ b/src/experiments/generic-experiment/experiment.hpp @@ -23,6 +23,7 @@ class GenericExperiment : public fail::DatabaseExperiment { bool enabled_e9_sol; std::string e9_file; SerialOutputLogger e9_sol; + std::vector e9_goldenrun; bool enabled_mem_text; fail::MemAccessListener l_mem_text; diff --git a/src/plugins/serialoutput/SerialOutputLogger.hpp b/src/plugins/serialoutput/SerialOutputLogger.hpp index 19e4f6f1..a2d85c35 100644 --- a/src/plugins/serialoutput/SerialOutputLogger.hpp +++ b/src/plugins/serialoutput/SerialOutputLogger.hpp @@ -40,6 +40,11 @@ public: * Returns the output variable. */ std::string getOutput(); + /** + * Sets the character limit. Does not truncate the stored data if it + * already exceeds the new limit. 0 = unlimited. + */ + void setLimit(unsigned char_limit) { m_limit = char_limit; } }; #endif // __SERIAL_OUTPUT_LOGGER_HPP__