From 41b0037897acef70991b40266a59e6e8b5c1377d Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Tue, 21 Oct 2025 07:43:45 +0000 Subject: [PATCH 01/24] Fix #14206 --showtime does not account for addons --- lib/cppcheck.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 2048d6f8098..e6ce7a4df11 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1505,7 +1505,9 @@ void CppCheck::executeAddons(const std::string& dumpFile, const FileWithDetails& { if (!dumpFile.empty()) { std::vector f{dumpFile}; - executeAddons(f, file.spath()); + Timer::run("CppCheck::executeAddons", mSettings.showtime, &s_timerResults, [&]() { + executeAddons(f, file.spath()); + }); } } From 4770995b7c26a46ebd53cb021884b3b247f817ff Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 22 Oct 2025 23:27:57 +0000 Subject: [PATCH 02/24] Add global timer --- Makefile | 2 +- cli/cppcheckexecutor.cpp | 5 +++++ lib/timer.cpp | 37 ++++++++++++++++++++++++++++++++++--- lib/timer.h | 17 +++++++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 5f47959f60e..54019dba637 100644 --- a/Makefile +++ b/Makefile @@ -683,7 +683,7 @@ frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h l cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h lib/xml.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp -cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h +cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 4b9809556b8..81606280339 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -37,6 +37,7 @@ #include "settings.h" #include "singleexecutor.h" #include "suppressions.h" +#include "timer.h" #include "utils.h" #if defined(HAS_THREADING_MODEL_THREAD) @@ -408,6 +409,7 @@ namespace { int CppCheckExecutor::check(int argc, const char* const argv[]) { + WholeProgramTimer timer; Settings settings; CmdLineLoggerStd logger; Suppressions supprs; @@ -419,6 +421,9 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) return EXIT_SUCCESS; } + if (settings.showtime == SHOWTIME_MODES::SHOWTIME_NONE) + timer.cancell(); + settings.loadSummaries(); mFiles = parser.getFiles(); diff --git a/lib/timer.cpp b/lib/timer.cpp index 4b1f07d5de3..a445364f44b 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -83,9 +83,6 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const } ++ordinal; } - - const double secOverall = overallData.seconds(); - std::cout << "Overall time: " << secOverall << "s" << std::endl; } void TimerResults::addResults(const std::string& str, std::clock_t clocks) @@ -142,3 +139,37 @@ void Timer::stop() mStopped = true; } + +WholeProgramTimer::~WholeProgramTimer() +{ + stop(); +} + +void WholeProgramTimer::stop() +{ + if (mCancelled) + return; + const auto end = std::chrono::high_resolution_clock::now(); + auto diff = std::chrono::duration_cast(end - mStart); + + // Extract hours + auto hours = std::chrono::duration_cast(diff); + diff -= hours; // Subtract the extracted hours + + // Extract minutes + auto minutes = std::chrono::duration_cast(diff); + diff -= minutes; // Subtract the extracted minutes + + // Extract seconds + auto seconds = static_cast(diff.count()) / std::chrono::microseconds::period::den; + + std::string ellapsedTime; + if (hours.count() > 0) + ellapsedTime += std::to_string(hours.count()) + "h "; + if (minutes.count() > 0) + ellapsedTime += std::to_string(minutes.count()) + "m "; + ellapsedTime += std::to_string(seconds) + "s "; + + std::lock_guard l(stdCoutLock); + std::cout << "Overall time: " << ellapsedTime << std::endl; +} diff --git a/lib/timer.h b/lib/timer.h index d2603d4eb55..7bec3ce6361 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -93,5 +93,22 @@ class CPPCHECKLIB Timer { const SHOWTIME_MODES mShowTimeMode = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; bool mStopped{}; }; + +class CPPCHECKLIB WholeProgramTimer { +public: + WholeProgramTimer() + : mStart(std::chrono::high_resolution_clock::now()) + {} + ~WholeProgramTimer(); + + void stop(); + + void cancell() { + mCancelled = true; + } +private: + std::chrono::system_clock::time_point mStart; + bool mCancelled{false}; +}; //--------------------------------------------------------------------------- #endif // timerH From 3ae57707294c3e6e728555531d837e1b5d1b08ff Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Fri, 24 Oct 2025 12:42:06 +0000 Subject: [PATCH 03/24] Rework + test fix --- cli/cppcheckexecutor.cpp | 8 ++++---- lib/timer.cpp | 12 ++---------- lib/timer.h | 22 ++++++---------------- test/testprocessexecutor.cpp | 2 +- 4 files changed, 13 insertions(+), 31 deletions(-) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 81606280339..ab8184c5f44 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -409,7 +409,7 @@ namespace { int CppCheckExecutor::check(int argc, const char* const argv[]) { - WholeProgramTimer timer; + auto startTime{Timer::now()}; Settings settings; CmdLineLoggerStd logger; Suppressions supprs; @@ -421,9 +421,6 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) return EXIT_SUCCESS; } - if (settings.showtime == SHOWTIME_MODES::SHOWTIME_NONE) - timer.cancell(); - settings.loadSummaries(); mFiles = parser.getFiles(); @@ -431,6 +428,9 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) const int ret = check_wrapper(settings, supprs); + if (settings.showtime != SHOWTIME_MODES::SHOWTIME_NONE) + Timer::calculateAndOutputTimeDiff(startTime, Timer::now()); + return ret; } diff --git a/lib/timer.cpp b/lib/timer.cpp index a445364f44b..efd59e97c8f 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -140,17 +140,9 @@ void Timer::stop() mStopped = true; } -WholeProgramTimer::~WholeProgramTimer() +void Timer::calculateAndOutputTimeDiff(const std::chrono::system_clock::time_point& start, const std::chrono::system_clock::time_point& end) { - stop(); -} - -void WholeProgramTimer::stop() -{ - if (mCancelled) - return; - const auto end = std::chrono::high_resolution_clock::now(); - auto diff = std::chrono::duration_cast(end - mStart); + auto diff = std::chrono::duration_cast(end - start); // Extract hours auto hours = std::chrono::duration_cast(diff); diff --git a/lib/timer.h b/lib/timer.h index 7bec3ce6361..c20437466c5 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -79,6 +79,12 @@ class CPPCHECKLIB Timer { Timer(const Timer&) = delete; Timer& operator=(const Timer&) = delete; + static std::chrono::system_clock::time_point now() { + return std::chrono::high_resolution_clock::now(); + } + + static void calculateAndOutputTimeDiff(const std::chrono::system_clock::time_point& start, const std::chrono::system_clock::time_point& end); + void stop(); static void run(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults, const std::function& f) { @@ -94,21 +100,5 @@ class CPPCHECKLIB Timer { bool mStopped{}; }; -class CPPCHECKLIB WholeProgramTimer { -public: - WholeProgramTimer() - : mStart(std::chrono::high_resolution_clock::now()) - {} - ~WholeProgramTimer(); - - void stop(); - - void cancell() { - mCancelled = true; - } -private: - std::chrono::system_clock::time_point mStart; - bool mCancelled{false}; -}; //--------------------------------------------------------------------------- #endif // timerH diff --git a/test/testprocessexecutor.cpp b/test/testprocessexecutor.cpp index c0c19ae2b1f..031048fa84e 100644 --- a/test/testprocessexecutor.cpp +++ b/test/testprocessexecutor.cpp @@ -248,7 +248,7 @@ class TestProcessExecutorBase : public TestFixture { $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // once: top5 results + overall + empty line - TODO_ASSERT_EQUALS(5 + 1 + 1, 2, cppcheck::count_all_of(output_s, '\n')); + TODO_ASSERT_EQUALS(5 + 1 + 1, 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); TODO_ASSERT(output_s.find("2 result(s)") != std::string::npos); From 2ba38c401d5ac80676d34b69fc037f123f98be7a Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Fri, 24 Oct 2025 14:58:40 +0000 Subject: [PATCH 04/24] Nits --- lib/timer.cpp | 2 +- lib/timer.h | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/timer.cpp b/lib/timer.cpp index efd59e97c8f..9e743a4a88a 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -140,7 +140,7 @@ void Timer::stop() mStopped = true; } -void Timer::calculateAndOutputTimeDiff(const std::chrono::system_clock::time_point& start, const std::chrono::system_clock::time_point& end) +void Timer::calculateAndOutputTimeDiff(const tp& start, const tp& end) { auto diff = std::chrono::duration_cast(end - start); diff --git a/lib/timer.h b/lib/timer.h index c20437466c5..c0b3dccda31 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -79,11 +79,13 @@ class CPPCHECKLIB Timer { Timer(const Timer&) = delete; Timer& operator=(const Timer&) = delete; - static std::chrono::system_clock::time_point now() { + using tp = std::chrono::time_point; + + static tp now() { return std::chrono::high_resolution_clock::now(); } - static void calculateAndOutputTimeDiff(const std::chrono::system_clock::time_point& start, const std::chrono::system_clock::time_point& end); + static void calculateAndOutputTimeDiff(const tp& start, const tp& end); void stop(); From b7e889a8638beb12d44f4e43fe67b0f3555eacf9 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Fri, 24 Oct 2025 15:23:46 +0000 Subject: [PATCH 05/24] Some test nits --- test/testsingleexecutor.cpp | 10 +++++----- test/testthreadexecutor.cpp | 11 +++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 4f0665ff12e..1b995b8a489 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -242,8 +242,8 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall + empty line - ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + overall + ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -253,8 +253,8 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + empty line - ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + overall + ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); @@ -267,7 +267,7 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - ASSERT_EQUALS(2, cppcheck::count_all_of(output_s, "Overall time:")); + ASSERT_EQUALS(1, cppcheck::count_all_of(output_s, "Overall time:")); } void showtime_summary() { diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index ad260727d01..252b8ffa957 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -233,10 +233,9 @@ class TestThreadExecutorBase : public TestFixture { "int main() {}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); - // for each file: top5 results + overall + empty line const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall + empty line - ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + overall + ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -246,8 +245,8 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + empty line - ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + overall + ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); @@ -260,7 +259,7 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - ASSERT_EQUALS(2, cppcheck::count_all_of(output_s, "Overall time:")); + ASSERT_EQUALS(1, cppcheck::count_all_of(output_s, "Overall time:")); } void showtime_summary() { From 170782ad20f5af7828eef5d4b611a86a86b9c2bb Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Mon, 27 Oct 2025 12:39:23 +0000 Subject: [PATCH 06/24] Test fix --- test/testsingleexecutor.cpp | 2 +- test/testthreadexecutor.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 1b995b8a489..9bcedd1bc92 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -267,7 +267,7 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - ASSERT_EQUALS(1, cppcheck::count_all_of(output_s, "Overall time:")); + ASSERT_EQUALS(0, cppcheck::count_all_of(output_s, "Overall time:")); } void showtime_summary() { diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index 252b8ffa957..f783367c11b 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -259,7 +259,7 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - ASSERT_EQUALS(1, cppcheck::count_all_of(output_s, "Overall time:")); + ASSERT_EQUALS(0, cppcheck::count_all_of(output_s, "Overall time:")); } void showtime_summary() { From 7006ea405bd872a961900b3f69f001569b42a2ed Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Mon, 27 Oct 2025 12:51:38 +0000 Subject: [PATCH 07/24] include --- lib/timer.h | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/timer.h b/lib/timer.h index c0b3dccda31..be85c50c54c 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -22,6 +22,7 @@ #include "config.h" +#include #include #include #include From d8c18c31922c668449ee980b9a3acc88015a9bb8 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Mon, 27 Oct 2025 13:06:36 +0000 Subject: [PATCH 08/24] Small nit --- lib/valueflow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 1f725673874..a039fea47f0 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -112,7 +112,6 @@ #include #include #include -#include #include #include #include From 6e587b51af881c00905197b41862ff4efc59bbd7 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Tue, 28 Oct 2025 10:30:26 +0000 Subject: [PATCH 09/24] Nits --- cli/cppcheckexecutor.cpp | 6 +++--- lib/cppcheck.cpp | 7 ++++--- lib/timer.cpp | 26 ++++++++++++++------------ lib/timer.h | 19 +++++++++++-------- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 742a9fc1c90..0c91672ea67 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -260,7 +260,7 @@ namespace { int CppCheckExecutor::check(int argc, const char* const argv[]) { - auto startTime{Timer::now()}; + Timer realTimeClock("", SHOWTIME_MODES::SHOWTIME_SUMMARY); Settings settings; CmdLineLoggerStd logger; Suppressions supprs; @@ -279,8 +279,8 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) const int ret = check_wrapper(settings, supprs); - if (settings.showtime != SHOWTIME_MODES::SHOWTIME_NONE) - Timer::calculateAndOutputTimeDiff(startTime, Timer::now()); + if (settings.showtime == SHOWTIME_MODES::SHOWTIME_NONE) + realTimeClock.cancelRealTimeMeasurement(); return ret; } diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index e6ce7a4df11..fb1da1c5d9f 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -895,7 +895,9 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str if (Settings::terminated()) return mLogger->exitcode(); - const Timer fileTotalTimer(mSettings.showtime == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL, file.spath()); + Timer WholeFileTimer{file.spath()}; + if (mSettings.showtime != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) + WholeFileTimer.cancelRealTimeMeasurement(); if (!mSettings.quiet) { std::string fixedpath = Path::toNativeSeparators(file.spath()); @@ -1311,8 +1313,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str // TODO: clear earlier? mLogger->clear(); - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_FILE || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_FILE) - printTimerResults(mSettings.showtime); + printTimerResults(mSettings.showtime); return mLogger->exitcode(); } diff --git a/lib/timer.cpp b/lib/timer.cpp index 9e743a4a88a..fc697dc0858 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -105,11 +105,13 @@ Timer::Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* tim , mStart(std::clock()) , mShowTimeMode(showtimeMode) , mStopped(showtimeMode == SHOWTIME_MODES::SHOWTIME_NONE || showtimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) + , mStartTimePoint(Clock::now()) {} -Timer::Timer(bool fileTotal, std::string filename) - : mStr(std::move(filename)) - , mStopped(!fileTotal) +Timer::Timer(std::string str) + : mStr(std::move(str)) + , mShowTimeMode(SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) + , mStartTimePoint(Clock::now()) {} Timer::~Timer() @@ -127,22 +129,25 @@ void Timer::stop() const double sec = static_cast(diff) / CLOCKS_PER_SEC; std::lock_guard l(stdCoutLock); std::cout << mStr << ": " << sec << "s" << std::endl; - } else if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) { - const double sec = static_cast(diff) / CLOCKS_PER_SEC; + } else if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL && mStartTimePoint != TimePoint{}) { std::lock_guard l(stdCoutLock); - std::cout << "Check time: " << mStr << ": " << sec << "s" << std::endl; + std::cout << "Check time: " << mStr << ": " << getRealTimePassed() << std::endl; } else { if (mTimerResults) mTimerResults->addResults(mStr, diff); + else if (mStr.empty() && mStartTimePoint != TimePoint{}) { // Get real time + std::lock_guard l(stdCoutLock); + std::cout << "Overall time: " << getRealTimePassed() << std::endl; + } } } mStopped = true; } -void Timer::calculateAndOutputTimeDiff(const tp& start, const tp& end) +std::string Timer::getRealTimePassed() { - auto diff = std::chrono::duration_cast(end - start); + auto diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); // Extract hours auto hours = std::chrono::duration_cast(diff); @@ -160,8 +165,5 @@ void Timer::calculateAndOutputTimeDiff(const tp& start, const tp& end) ellapsedTime += std::to_string(hours.count()) + "h "; if (minutes.count() > 0) ellapsedTime += std::to_string(minutes.count()) + "m "; - ellapsedTime += std::to_string(seconds) + "s "; - - std::lock_guard l(stdCoutLock); - std::cout << "Overall time: " << ellapsedTime << std::endl; + return (ellapsedTime + std::to_string(seconds) + "s "); } diff --git a/lib/timer.h b/lib/timer.h index be85c50c54c..87962bb5234 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -74,33 +74,36 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf { class CPPCHECKLIB Timer { public: Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults = nullptr); - Timer(bool fileTotal, std::string filename); + Timer(std::string str); ~Timer(); Timer(const Timer&) = delete; Timer& operator=(const Timer&) = delete; - using tp = std::chrono::time_point; - - static tp now() { - return std::chrono::high_resolution_clock::now(); - } - - static void calculateAndOutputTimeDiff(const tp& start, const tp& end); + using Clock = std::chrono::high_resolution_clock; + using TimePoint = std::chrono::time_point; void stop(); + void cancelRealTimeMeasurement() { + mStartTimePoint = TimePoint{}; + } + static void run(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults, const std::function& f) { Timer t(std::move(str), showtimeMode, timerResults); f(); } private: + + std::string getRealTimePassed(); + const std::string mStr; TimerResultsIntf* mTimerResults{}; std::clock_t mStart = std::clock(); const SHOWTIME_MODES mShowTimeMode = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; bool mStopped{}; + TimePoint mStartTimePoint{}; }; //--------------------------------------------------------------------------- From 2633020a00e15a3dca33b670e325297d4b9fcd5b Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Tue, 28 Oct 2025 10:45:09 +0000 Subject: [PATCH 10/24] Nits 2 --- lib/cppcheck.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index fb1da1c5d9f..0bbe92cbf03 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1313,7 +1313,8 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str // TODO: clear earlier? mLogger->clear(); - printTimerResults(mSettings.showtime); + if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_FILE || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_FILE) + printTimerResults(mSettings.showtime); return mLogger->exitcode(); } From aa049f8da8bca65f90a039e2337ca4934b451b6b Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 29 Oct 2025 10:36:20 +0000 Subject: [PATCH 11/24] Some more work --- cli/cppcheckexecutor.cpp | 6 ++-- lib/cppcheck.cpp | 4 +-- lib/timer.cpp | 73 ++++++++++------------------------------ lib/timer.h | 28 ++++++--------- test/testtimer.cpp | 7 +--- 5 files changed, 31 insertions(+), 87 deletions(-) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 0c91672ea67..222e7411539 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -260,7 +260,6 @@ namespace { int CppCheckExecutor::check(int argc, const char* const argv[]) { - Timer realTimeClock("", SHOWTIME_MODES::SHOWTIME_SUMMARY); Settings settings; CmdLineLoggerStd logger; Suppressions supprs; @@ -272,6 +271,8 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) return EXIT_SUCCESS; } + Timer realTimeClock("Summary", settings.showtime); + settings.loadSummaries(); mFiles = parser.getFiles(); @@ -279,9 +280,6 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) const int ret = check_wrapper(settings, supprs); - if (settings.showtime == SHOWTIME_MODES::SHOWTIME_NONE) - realTimeClock.cancelRealTimeMeasurement(); - return ret; } diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 0bbe92cbf03..8075b2ba92f 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -895,9 +895,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str if (Settings::terminated()) return mLogger->exitcode(); - Timer WholeFileTimer{file.spath()}; - if (mSettings.showtime != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) - WholeFileTimer.cancelRealTimeMeasurement(); + Timer WholeFileTimer{file.spath(), mSettings.showtime}; if (!mSettings.quiet) { std::string fixedpath = Path::toNativeSeparators(file.spath()); diff --git a/lib/timer.cpp b/lib/timer.cpp index fc697dc0858..92c50496b2a 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -29,7 +29,7 @@ namespace { using dataElementType = std::pair; bool more_second_sec(const dataElementType& lhs, const dataElementType& rhs) { - return lhs.second.seconds() > rhs.second.seconds(); + return lhs.second.getSeconds() > rhs.second.getSeconds(); } // TODO: remove and print through (synchronized) ErrorLogger instead @@ -42,8 +42,6 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const { if (mode == SHOWTIME_MODES::SHOWTIME_NONE || mode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) return; - - TimerResultsData overallData; std::vector data; { @@ -61,23 +59,8 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const size_t ordinal = 1; // maybe it would be nice to have an ordinal in output later! for (auto iter=data.cbegin(); iter!=data.cend(); ++iter) { - const double sec = iter->second.seconds(); + const double sec = iter->second.getSeconds().count(); const double secAverage = sec / static_cast(iter->second.mNumberOfResults); - bool hasParent = false; - { - // Do not use valueFlow.. in "Overall time" because those are included in Tokenizer already - if (startsWith(iter->first,"valueFlow")) - hasParent = true; - - // Do not use inner timers in "Overall time" - const std::string::size_type pos = iter->first.rfind("::"); - if (pos != std::string::npos) - hasParent = std::any_of(data.cbegin(), data.cend(), [iter,pos](const dataElementType& d) { - return d.first.size() == pos && iter->first.compare(0, d.first.size(), d.first) == 0; - }); - } - if (!hasParent) - overallData.mClocks += iter->second.mClocks; if ((mode != SHOWTIME_MODES::SHOWTIME_TOP5_FILE && mode != SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) || (ordinal<=5)) { std::cout << iter->first << ": " << sec << "s (avg. " << secAverage << "s - " << iter->second.mNumberOfResults << " result(s))" << std::endl; } @@ -85,11 +68,11 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const } } -void TimerResults::addResults(const std::string& str, std::clock_t clocks) +void TimerResults::addResults(const std::string& str, Duration duration) { std::lock_guard l(mResultsSync); - mResults[str].mClocks += clocks; + mResults[str].mDuration += duration; mResults[str].mNumberOfResults++; } @@ -102,15 +85,7 @@ void TimerResults::reset() Timer::Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults) : mStr(std::move(str)) , mTimerResults(timerResults) - , mStart(std::clock()) , mShowTimeMode(showtimeMode) - , mStopped(showtimeMode == SHOWTIME_MODES::SHOWTIME_NONE || showtimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) - , mStartTimePoint(Clock::now()) -{} - -Timer::Timer(std::string str) - : mStr(std::move(str)) - , mShowTimeMode(SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) , mStartTimePoint(Clock::now()) {} @@ -121,49 +96,35 @@ Timer::~Timer() void Timer::stop() { - if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && !mStopped) { - const std::clock_t end = std::clock(); - const std::clock_t diff = end - mStart; - - if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE) { - const double sec = static_cast(diff) / CLOCKS_PER_SEC; - std::lock_guard l(stdCoutLock); - std::cout << mStr << ": " << sec << "s" << std::endl; - } else if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL && mStartTimePoint != TimePoint{}) { + if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && mStartTimePoint != TimePoint{}) { + Duration diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); + if (!mTimerResults) { std::lock_guard l(stdCoutLock); - std::cout << "Check time: " << mStr << ": " << getRealTimePassed() << std::endl; + std::cout << (mStr == "Summary" ? "Overall time: " : "Check time: " + mStr + ": ")<< durationToString(diff) << std::endl; } else { - if (mTimerResults) - mTimerResults->addResults(mStr, diff); - else if (mStr.empty() && mStartTimePoint != TimePoint{}) { // Get real time - std::lock_guard l(stdCoutLock); - std::cout << "Overall time: " << getRealTimePassed() << std::endl; - } + mTimerResults->addResults(mStr, diff); } } - - mStopped = true; } -std::string Timer::getRealTimePassed() +std::string Timer::durationToString(Duration duration) { - auto diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); - // Extract hours - auto hours = std::chrono::duration_cast(diff); - diff -= hours; // Subtract the extracted hours + auto hours = std::chrono::duration_cast(duration); + duration -= hours; // Subtract the extracted hours // Extract minutes - auto minutes = std::chrono::duration_cast(diff); - diff -= minutes; // Subtract the extracted minutes + auto minutes = std::chrono::duration_cast(duration); + duration -= minutes; // Subtract the extracted minutes // Extract seconds - auto seconds = static_cast(diff.count()) / std::chrono::microseconds::period::den; + std::chrono::duration seconds = std::chrono::duration_cast>(duration); std::string ellapsedTime; if (hours.count() > 0) ellapsedTime += std::to_string(hours.count()) + "h "; if (minutes.count() > 0) ellapsedTime += std::to_string(minutes.count()) + "m "; - return (ellapsedTime + std::to_string(seconds) + "s "); + std::string secondsStr{std::to_string(seconds.count())}; + return (ellapsedTime + secondsStr.substr(0, secondsStr.length() - 3) + "s "); } diff --git a/lib/timer.h b/lib/timer.h index 87962bb5234..07b35a16d39 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -31,6 +31,10 @@ #include #include +using Clock = std::chrono::high_resolution_clock; +using TimePoint = std::chrono::time_point; +using Duration = std::chrono::milliseconds; + enum class SHOWTIME_MODES : std::uint8_t { SHOWTIME_NONE, SHOWTIME_FILE, @@ -44,16 +48,15 @@ class CPPCHECKLIB TimerResultsIntf { public: virtual ~TimerResultsIntf() = default; - virtual void addResults(const std::string& str, std::clock_t clocks) = 0; + virtual void addResults(const std::string& timerName, Duration duation) = 0; }; struct TimerResultsData { - std::clock_t mClocks{}; + Duration mDuration; long mNumberOfResults{}; - double seconds() const { - const double ret = static_cast(static_cast(mClocks)) / static_cast(CLOCKS_PER_SEC); - return ret; + std::chrono::duration getSeconds() const { + return std::chrono::duration_cast>(mDuration); } }; @@ -62,7 +65,7 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf { TimerResults() = default; void showResults(SHOWTIME_MODES mode) const; - void addResults(const std::string& str, std::clock_t clocks) override; + void addResults(const std::string& str, Duration duration) override; void reset(); @@ -74,20 +77,14 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf { class CPPCHECKLIB Timer { public: Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults = nullptr); - Timer(std::string str); ~Timer(); Timer(const Timer&) = delete; Timer& operator=(const Timer&) = delete; - using Clock = std::chrono::high_resolution_clock; - using TimePoint = std::chrono::time_point; - void stop(); - void cancelRealTimeMeasurement() { - mStartTimePoint = TimePoint{}; - } + static std::string durationToString(Duration duration); static void run(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults, const std::function& f) { Timer t(std::move(str), showtimeMode, timerResults); @@ -95,14 +92,9 @@ class CPPCHECKLIB Timer { } private: - - std::string getRealTimePassed(); - const std::string mStr; TimerResultsIntf* mTimerResults{}; - std::clock_t mStart = std::clock(); const SHOWTIME_MODES mShowTimeMode = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; - bool mStopped{}; TimePoint mStartTimePoint{}; }; diff --git a/test/testtimer.cpp b/test/testtimer.cpp index 00b3b810bbc..315cbc6cfda 100644 --- a/test/testtimer.cpp +++ b/test/testtimer.cpp @@ -33,12 +33,7 @@ class TestTimer : public TestFixture { } void result() const { - TimerResultsData t1; - t1.mClocks = ~static_cast(0); - ASSERT(t1.seconds() > 100.0); - - t1.mClocks = CLOCKS_PER_SEC * 5 / 2; - ASSERT(std::fabs(t1.seconds()-2.5) < 0.01); + // TODO add some tests } }; From 270ba3541c32bc606ee3bfea3af1d91f26cf4363 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 29 Oct 2025 10:57:09 +0000 Subject: [PATCH 12/24] Some test revert --- test/testsingleexecutor.cpp | 8 ++++---- test/testthreadexecutor.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 9bcedd1bc92..7defe1887e7 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -242,8 +242,8 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall - ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + overall + empty line + ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -253,8 +253,8 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall - ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + overall + empty line + ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index f783367c11b..4b279b0e66f 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -234,8 +234,8 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall - ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + overall + empty line + ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -245,8 +245,8 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall - ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + overall + empty line + ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); From 98f362d08b2dfac6c90881da519ec3c5c1268a10 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 29 Oct 2025 11:12:21 +0000 Subject: [PATCH 13/24] Small nits --- lib/timer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/timer.cpp b/lib/timer.cpp index 92c50496b2a..0161d35e1a0 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -99,6 +99,8 @@ void Timer::stop() if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && mStartTimePoint != TimePoint{}) { Duration diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); if (!mTimerResults) { + if (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_SUMMARY) + return; std::lock_guard l(stdCoutLock); std::cout << (mStr == "Summary" ? "Overall time: " : "Check time: " + mStr + ": ")<< durationToString(diff) << std::endl; } else { From bbb51998e4de9f93b2fb7ed6e90e078c66c055bb Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 29 Oct 2025 11:24:12 +0000 Subject: [PATCH 14/24] Small nits --- test/testsingleexecutor.cpp | 8 ++++---- test/testthreadexecutor.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 7defe1887e7..9bcedd1bc92 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -242,8 +242,8 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall + empty line - ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + overall + ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -253,8 +253,8 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + empty line - ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + overall + ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index 4b279b0e66f..f783367c11b 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -234,8 +234,8 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall + empty line - ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + overall + ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -245,8 +245,8 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + empty line - ASSERT_EQUALS(5 + 1 + 1, cppcheck::count_all_of(output_s, '\n')); + // once: top5 results + overall + ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); ASSERT(output_s.find("2 result(s)") != std::string::npos); From a576a5415449a71caa6c575ba8f5716168b6e912 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 29 Oct 2025 11:57:56 +0000 Subject: [PATCH 15/24] Nits --- lib/timer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/timer.cpp b/lib/timer.cpp index 0161d35e1a0..1920ef05650 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -99,7 +99,11 @@ void Timer::stop() if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && mStartTimePoint != TimePoint{}) { Duration diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); if (!mTimerResults) { - if (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_SUMMARY) + if (mStr == "Summary" + && (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_TOP5_FILE && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_SUMMARY)) + return; + if (mStr != "Summary" + && (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)) return; std::lock_guard l(stdCoutLock); std::cout << (mStr == "Summary" ? "Overall time: " : "Check time: " + mStr + ": ")<< durationToString(diff) << std::endl; From 45e3b2da830d44851b95891bb6966588d02af895 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 29 Oct 2025 13:29:02 +0000 Subject: [PATCH 16/24] Nits --- lib/cppcheck.cpp | 2 +- lib/timer.h | 2 +- test/testtimer.cpp | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 8075b2ba92f..0752b4a74d8 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -895,7 +895,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str if (Settings::terminated()) return mLogger->exitcode(); - Timer WholeFileTimer{file.spath(), mSettings.showtime}; + const Timer fileTotalTimer{file.spath(), mSettings.showtime}; if (!mSettings.quiet) { std::string fixedpath = Path::toNativeSeparators(file.spath()); diff --git a/lib/timer.h b/lib/timer.h index 07b35a16d39..6d05f00e83e 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -95,7 +95,7 @@ class CPPCHECKLIB Timer { const std::string mStr; TimerResultsIntf* mTimerResults{}; const SHOWTIME_MODES mShowTimeMode = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; - TimePoint mStartTimePoint{}; + TimePoint mStartTimePoint; }; //--------------------------------------------------------------------------- diff --git a/test/testtimer.cpp b/test/testtimer.cpp index 315cbc6cfda..75ced130f1f 100644 --- a/test/testtimer.cpp +++ b/test/testtimer.cpp @@ -33,7 +33,11 @@ class TestTimer : public TestFixture { } void result() const { - // TODO add some tests + TimerResultsData t1; + t1.mDuration = Duration{1234}; + ASSERT(t1.getSeconds().count() > 1.233 && t1.getSeconds().count() < 1.235); + + // TODO : more tests } }; From e344a79185050116b7827142e3cc93fa1a44f36e Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Thu, 30 Oct 2025 09:34:40 +0000 Subject: [PATCH 17/24] Global var --- cli/cppcheckexecutor.cpp | 2 +- lib/timer.cpp | 6 +++--- lib/timer.h | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 222e7411539..671c6fff941 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -271,7 +271,7 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) return EXIT_SUCCESS; } - Timer realTimeClock("Summary", settings.showtime); + Timer realTimeClock(OVERALL_TIMER, settings.showtime); settings.loadSummaries(); diff --git a/lib/timer.cpp b/lib/timer.cpp index 1920ef05650..16383fba74e 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -99,14 +99,14 @@ void Timer::stop() if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && mStartTimePoint != TimePoint{}) { Duration diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); if (!mTimerResults) { - if (mStr == "Summary" + if (mStr == OVERALL_TIMER && (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_TOP5_FILE && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_SUMMARY)) return; - if (mStr != "Summary" + if (mStr != OVERALL_TIMER && (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)) return; std::lock_guard l(stdCoutLock); - std::cout << (mStr == "Summary" ? "Overall time: " : "Check time: " + mStr + ": ")<< durationToString(diff) << std::endl; + std::cout << (mStr == OVERALL_TIMER ? "Overall time: " : "Check time: " + mStr + ": ")<< durationToString(diff) << std::endl; } else { mTimerResults->addResults(mStr, diff); } diff --git a/lib/timer.h b/lib/timer.h index 6d05f00e83e..c7efb33dfd8 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -35,6 +35,8 @@ using Clock = std::chrono::high_resolution_clock; using TimePoint = std::chrono::time_point; using Duration = std::chrono::milliseconds; +constexpr char* OVERALL_TIMER = "Summary"; + enum class SHOWTIME_MODES : std::uint8_t { SHOWTIME_NONE, SHOWTIME_FILE, From d4a936d69b6ba39a9b52d8eda539648496daeb3c Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Thu, 30 Oct 2025 09:40:43 +0000 Subject: [PATCH 18/24] Nit --- lib/timer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/timer.h b/lib/timer.h index c7efb33dfd8..cb5690df5b0 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -35,7 +35,7 @@ using Clock = std::chrono::high_resolution_clock; using TimePoint = std::chrono::time_point; using Duration = std::chrono::milliseconds; -constexpr char* OVERALL_TIMER = "Summary"; +static constexpr char OVERALL_TIMER[] = "Summary"; enum class SHOWTIME_MODES : std::uint8_t { SHOWTIME_NONE, From 6271c02e2b15e5949f24794a300d0509e6ed2f0b Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Thu, 30 Oct 2025 16:42:18 +0000 Subject: [PATCH 19/24] Small nits --- cli/cmdlineparser.cpp | 12 +++++------ cli/cppcheckexecutor.cpp | 2 +- cli/processexecutor.cpp | 2 +- cli/singleexecutor.cpp | 2 +- cli/threadexecutor.cpp | 2 +- lib/cppcheck.cpp | 6 +++--- lib/cppcheck.h | 4 ++-- lib/settings.h | 4 ++-- lib/timer.cpp | 29 ++++++++++++++----------- lib/timer.h | 42 +++++++++++++++++------------------- lib/tokenize.cpp | 4 ++-- test/testcmdlineparser.cpp | 12 +++++------ test/testprocessexecutor.cpp | 14 ++++++------ test/testsingleexecutor.cpp | 14 ++++++------ test/testthreadexecutor.cpp | 14 ++++++------ test/testtimer.cpp | 2 +- 16 files changed, 83 insertions(+), 82 deletions(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index b9006711ce1..d7b8c260128 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -1393,17 +1393,17 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a else if (std::strncmp(argv[i], "--showtime=", 11) == 0) { const std::string showtimeMode = argv[i] + 11; if (showtimeMode == "file") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_FILE; + mSettings.showtime = ShowTime::FILE; else if (showtimeMode == "file-total") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; + mSettings.showtime = ShowTime::FILE_TOTAL; else if (showtimeMode == "summary") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY; + mSettings.showtime = ShowTime::SUMMARY; else if (showtimeMode == "top5_file") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE; + mSettings.showtime = ShowTime::TOP5_FILE; else if (showtimeMode == "top5_summary") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY; + mSettings.showtime = ShowTime::TOP5_SUMMARY; else if (showtimeMode == "none") - mSettings.showtime = SHOWTIME_MODES::SHOWTIME_NONE; + mSettings.showtime = ShowTime::NONE; else if (showtimeMode.empty()) { mLogger.printError("no mode provided for --showtime"); return Result::Fail; diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 671c6fff941..55afaaf0693 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -271,7 +271,7 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) return EXIT_SUCCESS; } - Timer realTimeClock(OVERALL_TIMER, settings.showtime); + Timer realTimeClock(Timer::OVERALL, settings.showtime); settings.loadSummaries(); diff --git a/cli/processexecutor.cpp b/cli/processexecutor.cpp index 8d25bf3803c..7efd4106db1 100644 --- a/cli/processexecutor.cpp +++ b/cli/processexecutor.cpp @@ -450,7 +450,7 @@ unsigned int ProcessExecutor::check() } // TODO: wee need to get the timing information from the subprocess - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) + if (mSettings.showtime == ShowTime::SUMMARY || mSettings.showtime == ShowTime::TOP5_SUMMARY) CppCheck::printTimerResults(mSettings.showtime); return result; diff --git a/cli/singleexecutor.cpp b/cli/singleexecutor.cpp index 5d7e4a83f9d..54cab1cb8d8 100644 --- a/cli/singleexecutor.cpp +++ b/cli/singleexecutor.cpp @@ -70,7 +70,7 @@ unsigned int SingleExecutor::check() if (mCppcheck.analyseWholeProgram()) result++; - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) + if (mSettings.showtime == ShowTime::SUMMARY || mSettings.showtime == ShowTime::TOP5_SUMMARY) CppCheck::printTimerResults(mSettings.showtime); return result; diff --git a/cli/threadexecutor.cpp b/cli/threadexecutor.cpp index 75b1a4524c6..b1bc75731ff 100644 --- a/cli/threadexecutor.cpp +++ b/cli/threadexecutor.cpp @@ -214,7 +214,7 @@ unsigned int ThreadExecutor::check() return v + f.get(); }); - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) + if (mSettings.showtime == ShowTime::SUMMARY || mSettings.showtime == ShowTime::TOP5_SUMMARY) CppCheck::printTimerResults(mSettings.showtime); return result; diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 0752b4a74d8..50cc188d3f4 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1155,7 +1155,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str Tokenizer tokenizer(std::move(tokenlist), mErrorLogger); try { - if (mSettings.showtime != SHOWTIME_MODES::SHOWTIME_NONE) + if (mSettings.showtime != ShowTime::NONE) tokenizer.setTimerResults(&s_timerResults); tokenizer.setDirectives(directives); // TODO: how to avoid repeated copies? @@ -1311,7 +1311,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str // TODO: clear earlier? mLogger->clear(); - if (mSettings.showtime == SHOWTIME_MODES::SHOWTIME_FILE || mSettings.showtime == SHOWTIME_MODES::SHOWTIME_TOP5_FILE) + if (mSettings.showtime == ShowTime::FILE || mSettings.showtime == ShowTime::TOP5_FILE) printTimerResults(mSettings.showtime); return mLogger->exitcode(); @@ -1936,7 +1936,7 @@ void CppCheck::resetTimerResults() s_timerResults.reset(); } -void CppCheck::printTimerResults(SHOWTIME_MODES mode) +void CppCheck::printTimerResults(ShowTime mode) { s_timerResults.showResults(mode); } diff --git a/lib/cppcheck.h b/lib/cppcheck.h index 9108ac28430..c23309f03d7 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -33,7 +33,7 @@ #include class TokenList; -enum class SHOWTIME_MODES : std::uint8_t; +enum class ShowTime : std::uint8_t; struct FileSettings; class CheckUnusedFunctions; class Tokenizer; @@ -143,7 +143,7 @@ class CPPCHECKLIB CppCheck { unsigned int analyseWholeProgram(const std::string &buildDir, const std::list &files, const std::list& fileSettings, const std::string& ctuInfo); static void resetTimerResults(); - static void printTimerResults(SHOWTIME_MODES mode); + static void printTimerResults(ShowTime mode); private: void purgedConfigurationMessage(const std::string &file, const std::string& configuration); diff --git a/lib/settings.h b/lib/settings.h index 7e70adfdd32..4582fa54932 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -51,7 +51,7 @@ class Regex; #endif struct Suppressions; -enum class SHOWTIME_MODES : std::uint8_t; +enum class ShowTime : std::uint8_t; namespace ValueFlow { class Value; } @@ -410,7 +410,7 @@ class CPPCHECKLIB WARN_UNUSED Settings { SimpleEnableGroup checks; /** @brief show timing information (--showtime=file|summary|top5) */ - SHOWTIME_MODES showtime{}; + ShowTime showtime{}; /** Struct contains standards settings */ Standards standards; diff --git a/lib/timer.cpp b/lib/timer.cpp index 16383fba74e..b3bfbdbd1a9 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -25,6 +25,8 @@ #include #include +constexpr char Timer::OVERALL[]; + namespace { using dataElementType = std::pair; bool more_second_sec(const dataElementType& lhs, const dataElementType& rhs) @@ -38,9 +40,9 @@ namespace { // TODO: this does not include any file context when SHOWTIME_FILE thus rendering it useless - should we include the logging with the progress logging? // that could also get rid of the broader locking -void TimerResults::showResults(SHOWTIME_MODES mode) const +void TimerResults::showResults(ShowTime mode) const { - if (mode == SHOWTIME_MODES::SHOWTIME_NONE || mode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL) + if (mode == ShowTime::NONE || mode == ShowTime::FILE_TOTAL) return; std::vector data; @@ -61,14 +63,14 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const for (auto iter=data.cbegin(); iter!=data.cend(); ++iter) { const double sec = iter->second.getSeconds().count(); const double secAverage = sec / static_cast(iter->second.mNumberOfResults); - if ((mode != SHOWTIME_MODES::SHOWTIME_TOP5_FILE && mode != SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) || (ordinal<=5)) { + if ((mode != ShowTime::TOP5_FILE && mode != ShowTime::TOP5_SUMMARY) || (ordinal<=5)) { std::cout << iter->first << ": " << sec << "s (avg. " << secAverage << "s - " << iter->second.mNumberOfResults << " result(s))" << std::endl; } ++ordinal; } } -void TimerResults::addResults(const std::string& str, Duration duration) +void TimerResults::addResults(const std::string& str, std::chrono::milliseconds duration) { std::lock_guard l(mResultsSync); @@ -82,7 +84,7 @@ void TimerResults::reset() mResults.clear(); } -Timer::Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults) +Timer::Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults) : mStr(std::move(str)) , mTimerResults(timerResults) , mShowTimeMode(showtimeMode) @@ -96,24 +98,25 @@ Timer::~Timer() void Timer::stop() { - if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && mStartTimePoint != TimePoint{}) { - Duration diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); + if ((mShowTimeMode != ShowTime::NONE) && mStartTimePoint != TimePoint{}) { + auto diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); if (!mTimerResults) { - if (mStr == OVERALL_TIMER - && (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_TOP5_FILE && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_SUMMARY)) + if (mStr == OVERALL + && (mShowTimeMode != ShowTime::TOP5_SUMMARY && mShowTimeMode != ShowTime::TOP5_FILE && mShowTimeMode != ShowTime::SUMMARY)) return; - if (mStr != OVERALL_TIMER - && (mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE && mShowTimeMode != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)) + if (mStr != OVERALL + && (mShowTimeMode != ShowTime::FILE && mShowTimeMode != ShowTime::FILE_TOTAL)) return; std::lock_guard l(stdCoutLock); - std::cout << (mStr == OVERALL_TIMER ? "Overall time: " : "Check time: " + mStr + ": ")<< durationToString(diff) << std::endl; + std::cout << (mStr == OVERALL ? "Overall time: " : "Check time: " + mStr + ": ")<< TimerResultsData::durationToString(diff) << std::endl; } else { mTimerResults->addResults(mStr, diff); } } + mShowTimeMode = ShowTime::NONE; // prevent multiple stops } -std::string Timer::durationToString(Duration duration) +std::string TimerResultsData::durationToString(std::chrono::milliseconds duration) { // Extract hours auto hours = std::chrono::duration_cast(duration); diff --git a/lib/timer.h b/lib/timer.h index cb5690df5b0..27be8eb74de 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -31,43 +31,39 @@ #include #include -using Clock = std::chrono::high_resolution_clock; -using TimePoint = std::chrono::time_point; -using Duration = std::chrono::milliseconds; - -static constexpr char OVERALL_TIMER[] = "Summary"; - -enum class SHOWTIME_MODES : std::uint8_t { - SHOWTIME_NONE, - SHOWTIME_FILE, - SHOWTIME_FILE_TOTAL, - SHOWTIME_SUMMARY, - SHOWTIME_TOP5_SUMMARY, - SHOWTIME_TOP5_FILE +enum class ShowTime : std::uint8_t { + NONE, + FILE, + FILE_TOTAL, + SUMMARY, + TOP5_SUMMARY, + TOP5_FILE }; class CPPCHECKLIB TimerResultsIntf { public: virtual ~TimerResultsIntf() = default; - virtual void addResults(const std::string& timerName, Duration duation) = 0; + virtual void addResults(const std::string& timerName, std::chrono::milliseconds duation) = 0; }; struct TimerResultsData { - Duration mDuration; + std::chrono::milliseconds mDuration; long mNumberOfResults{}; std::chrono::duration getSeconds() const { return std::chrono::duration_cast>(mDuration); } + + static std::string durationToString(std::chrono::milliseconds duration); }; class CPPCHECKLIB TimerResults : public TimerResultsIntf { public: TimerResults() = default; - void showResults(SHOWTIME_MODES mode) const; - void addResults(const std::string& str, Duration duration) override; + void showResults(ShowTime mode) const; + void addResults(const std::string& str, std::chrono::milliseconds duration) override; void reset(); @@ -78,7 +74,11 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf { class CPPCHECKLIB Timer { public: - Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults = nullptr); + static constexpr char OVERALL[] = "Summary"; + using Clock = std::chrono::high_resolution_clock; + using TimePoint = std::chrono::time_point; + + Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults = nullptr); ~Timer(); Timer(const Timer&) = delete; @@ -86,9 +86,7 @@ class CPPCHECKLIB Timer { void stop(); - static std::string durationToString(Duration duration); - - static void run(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults, const std::function& f) { + static void run(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults, const std::function& f) { Timer t(std::move(str), showtimeMode, timerResults); f(); } @@ -96,7 +94,7 @@ class CPPCHECKLIB Timer { private: const std::string mStr; TimerResultsIntf* mTimerResults{}; - const SHOWTIME_MODES mShowTimeMode = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL; + ShowTime mShowTimeMode = ShowTime::FILE_TOTAL; TimePoint mStartTimePoint; }; diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 506568d1a3b..b791c4b508f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3405,7 +3405,7 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration, int fileIndex) return false; } - const SHOWTIME_MODES showTime = mTimerResults ? mSettings.showtime : SHOWTIME_MODES::SHOWTIME_NONE; + const ShowTime showTime = mTimerResults ? mSettings.showtime : ShowTime::NONE; Timer::run("Tokenizer::simplifyTokens1::createAst", showTime, mTimerResults, [&]() { list.createAst(); @@ -5624,7 +5624,7 @@ bool Tokenizer::simplifyTokenList1(const char FileName[]) validate(); - const SHOWTIME_MODES showTime = mTimerResults ? mSettings.showtime : SHOWTIME_MODES::SHOWTIME_NONE; + const ShowTime showTime = mTimerResults ? mSettings.showtime : ShowTime::NONE; // Bail out if code is garbage Timer::run("Tokenizer::simplifyTokens1::simplifyTokenList1::findGarbageCode", showTime, mTimerResults, [&]() { diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 9a1fb64279e..2902424b52d 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -2096,21 +2096,21 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=summary", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_SUMMARY); + ASSERT(settings->showtime == ShowTime::SUMMARY); } void showtimeFile() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=file", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_FILE); + ASSERT(settings->showtime == ShowTime::FILE); } void showtimeFileTotal() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=file-total", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL); + ASSERT(settings->showtime == ShowTime::FILE_TOTAL); } void showtimeTop5() { @@ -2124,21 +2124,21 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=top5_file", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_TOP5_FILE); + ASSERT(settings->showtime == ShowTime::TOP5_FILE); } void showtimeTop5Summary() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=top5_summary", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY); + ASSERT(settings->showtime == ShowTime::TOP5_SUMMARY); } void showtimeNone() { REDIRECT; const char * const argv[] = {"cppcheck", "--showtime=none", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); - ASSERT(settings->showtime == SHOWTIME_MODES::SHOWTIME_NONE); + ASSERT(settings->showtime == ShowTime::NONE); } void showtimeEmpty() { diff --git a/test/testprocessexecutor.cpp b/test/testprocessexecutor.cpp index 031048fa84e..51480619dc2 100644 --- a/test/testprocessexecutor.cpp +++ b/test/testprocessexecutor.cpp @@ -52,7 +52,7 @@ class TestProcessExecutorBase : public TestFixture { struct CheckOptions { bool quiet = true; - SHOWTIME_MODES showtime = SHOWTIME_MODES::SHOWTIME_NONE; + ShowTime showtime = ShowTime::NONE; const char* plistOutput = nullptr; std::vector filesList; }; @@ -164,7 +164,7 @@ class TestProcessExecutorBase : public TestFixture { "void f()\n" "{\n" " (void)(*((int*)0));\n" - "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + "}", dinit(CheckOptions, $.showtime = ShowTime::SUMMARY)); // we are not interested in the results - so just consume them ignore_errout(); } @@ -233,7 +233,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); + $.showtime = ShowTime::TOP5_FILE)); // for each file: top5 results + overall + empty line const std::string output_s = GET_REDIRECT_OUTPUT; // for each file: top5 results + overall + empty line @@ -245,7 +245,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); + $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // once: top5 results + overall + empty line TODO_ASSERT_EQUALS(5 + 1 + 1, 1, cppcheck::count_all_of(output_s, '\n')); @@ -259,7 +259,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); + $.showtime = ShowTime::FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; TODO_ASSERT_EQUALS(2, 0, cppcheck::count_all_of(output_s, "Overall time:")); } @@ -269,7 +269,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + $.showtime = ShowTime::SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // should only report the actual summary once ASSERT(output_s.find("1 result(s)") == std::string::npos); @@ -281,7 +281,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)); + $.showtime = ShowTime::FILE_TOTAL)); const std::string output_s = GET_REDIRECT_OUTPUT; TODO_ASSERT(output_s.find("Check time: " + fprefix() + "_1.c: ") != std::string::npos); TODO_ASSERT(output_s.find("Check time: " + fprefix() + "_2.c: ") != std::string::npos); diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 9bcedd1bc92..954b63287db 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -61,7 +61,7 @@ class TestSingleExecutorBase : public TestFixture { struct CheckOptions { bool quiet = true; - SHOWTIME_MODES showtime = SHOWTIME_MODES::SHOWTIME_NONE; + ShowTime showtime = ShowTime::NONE; const char* plistOutput = nullptr; std::vector filesList; }; @@ -166,7 +166,7 @@ class TestSingleExecutorBase : public TestFixture { "void f()\n" "{\n" " (void)(*((int*)0));\n" - "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + "}", dinit(CheckOptions, $.showtime = ShowTime::SUMMARY)); // we are not interested in the results - so just consume them ignore_errout(); } @@ -240,7 +240,7 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); + $.showtime = ShowTime::TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; // for each file: top5 results + overall ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); @@ -251,7 +251,7 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); + $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // once: top5 results + overall ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); @@ -265,7 +265,7 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); + $.showtime = ShowTime::FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; ASSERT_EQUALS(0, cppcheck::count_all_of(output_s, "Overall time:")); } @@ -275,7 +275,7 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + $.showtime = ShowTime::SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // should only report the actual summary once ASSERT(output_s.find("1 result(s)") == std::string::npos); @@ -287,7 +287,7 @@ class TestSingleExecutorBase : public TestFixture { check(2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)); + $.showtime = ShowTime::FILE_TOTAL)); const std::string output_s = GET_REDIRECT_OUTPUT; ASSERT(output_s.find("Check time: " + fprefix() + "_" + zpad3(1) + ".c: ") != std::string::npos); ASSERT(output_s.find("Check time: " + fprefix() + "_" + zpad3(2) + ".c: ") != std::string::npos); diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index f783367c11b..410c5a2c3d3 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -52,7 +52,7 @@ class TestThreadExecutorBase : public TestFixture { struct CheckOptions { bool quiet = true; - SHOWTIME_MODES showtime = SHOWTIME_MODES::SHOWTIME_NONE; + ShowTime showtime = ShowTime::NONE; const char* plistOutput = nullptr; std::vector filesList; }; @@ -163,7 +163,7 @@ class TestThreadExecutorBase : public TestFixture { "void f()\n" "{\n" " (void)(*((int*)0));\n" - "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + "}", dinit(CheckOptions, $.showtime = ShowTime::SUMMARY)); // we are not interested in the results - so just consume them ignore_errout(); } @@ -232,7 +232,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_FILE)); + $.showtime = ShowTime::TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; // for each file: top5 results + overall ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); @@ -243,7 +243,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY)); + $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // once: top5 results + overall ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); @@ -257,7 +257,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE)); + $.showtime = ShowTime::FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; ASSERT_EQUALS(0, cppcheck::count_all_of(output_s, "Overall time:")); } @@ -267,7 +267,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + $.showtime = ShowTime::SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; // should only report the actual summary once ASSERT(output_s.find("1 result(s)") == std::string::npos); @@ -279,7 +279,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 0, "int main() {}", dinit(CheckOptions, - $.showtime = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)); + $.showtime = ShowTime::FILE_TOTAL)); const std::string output_s = GET_REDIRECT_OUTPUT; ASSERT(output_s.find("Check time: " + fprefix() + "_1.c: ") != std::string::npos); ASSERT(output_s.find("Check time: " + fprefix() + "_2.c: ") != std::string::npos); diff --git a/test/testtimer.cpp b/test/testtimer.cpp index 75ced130f1f..c9bc570863b 100644 --- a/test/testtimer.cpp +++ b/test/testtimer.cpp @@ -34,7 +34,7 @@ class TestTimer : public TestFixture { void result() const { TimerResultsData t1; - t1.mDuration = Duration{1234}; + t1.mDuration = std::chrono::milliseconds{1234}; ASSERT(t1.getSeconds().count() > 1.233 && t1.getSeconds().count() < 1.235); // TODO : more tests From ed23668639e7ce915beb77fac8491f8ed65df341 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Thu, 30 Oct 2025 16:46:35 +0000 Subject: [PATCH 20/24] Anoher small nit --- lib/timer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/timer.cpp b/lib/timer.cpp index b3bfbdbd1a9..e186962a00e 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -135,5 +135,5 @@ std::string TimerResultsData::durationToString(std::chrono::milliseconds duratio if (minutes.count() > 0) ellapsedTime += std::to_string(minutes.count()) + "m "; std::string secondsStr{std::to_string(seconds.count())}; - return (ellapsedTime + secondsStr.substr(0, secondsStr.length() - 3) + "s "); + return (ellapsedTime + secondsStr.substr(0, secondsStr.length() - 3) + "s"); } From d83f797ebd7cb179908a914ef1786ec395067777 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 5 Nov 2025 15:03:47 +0000 Subject: [PATCH 21/24] SOme more changes --- cli/cppcheckexecutor.cpp | 2 +- lib/cppcheck.cpp | 2 +- lib/timer.cpp | 41 ++++++++++++++++++++----------------- lib/timer.h | 18 ++++++++++------ test/testsingleexecutor.cpp | 6 +++--- test/testthreadexecutor.cpp | 6 +++--- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 55afaaf0693..cbe519078f7 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -271,7 +271,7 @@ int CppCheckExecutor::check(int argc, const char* const argv[]) return EXIT_SUCCESS; } - Timer realTimeClock(Timer::OVERALL, settings.showtime); + Timer realTimeClock("", settings.showtime, nullptr, Timer::Type::OVERALL); settings.loadSummaries(); diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 50cc188d3f4..78e202cd09b 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -895,7 +895,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str if (Settings::terminated()) return mLogger->exitcode(); - const Timer fileTotalTimer{file.spath(), mSettings.showtime}; + const Timer fileTotalTimer{file.spath(), mSettings.showtime, nullptr, Timer::Type::FILE}; if (!mSettings.quiet) { std::string fixedpath = Path::toNativeSeparators(file.spath()); diff --git a/lib/timer.cpp b/lib/timer.cpp index e186962a00e..1bea8771017 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -25,8 +25,6 @@ #include #include -constexpr char Timer::OVERALL[]; - namespace { using dataElementType = std::pair; bool more_second_sec(const dataElementType& lhs, const dataElementType& rhs) @@ -84,11 +82,12 @@ void TimerResults::reset() mResults.clear(); } -Timer::Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults) - : mStr(std::move(str)) - , mTimerResults(timerResults) - , mShowTimeMode(showtimeMode) - , mStartTimePoint(Clock::now()) +Timer::Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults, Type type) + : mName(std::move(str)) + , mMode(showtimeMode) + , mType(type) + , mStart(Clock::now()) + , mResults(timerResults) {} Timer::~Timer() @@ -98,22 +97,26 @@ Timer::~Timer() void Timer::stop() { - if ((mShowTimeMode != ShowTime::NONE) && mStartTimePoint != TimePoint{}) { - auto diff = std::chrono::duration_cast(Clock::now() - mStartTimePoint); - if (!mTimerResults) { - if (mStr == OVERALL - && (mShowTimeMode != ShowTime::TOP5_SUMMARY && mShowTimeMode != ShowTime::TOP5_FILE && mShowTimeMode != ShowTime::SUMMARY)) - return; - if (mStr != OVERALL - && (mShowTimeMode != ShowTime::FILE && mShowTimeMode != ShowTime::FILE_TOTAL)) - return; + if (mMode == ShowTime::NONE) + return; + if (mType == Type::OVERALL && mMode != ShowTime::TOP5_SUMMARY && mMode != ShowTime::SUMMARY) { + mMode = ShowTime::NONE; + return; + } + if (mType == Type::FILE && mMode != ShowTime::TOP5_FILE && mMode != ShowTime::FILE && mMode != ShowTime::FILE_TOTAL) { + mMode = ShowTime::NONE; + return; + } + if (mStart != TimePoint{}) { + auto diff = std::chrono::duration_cast(Clock::now() - mStart); + if (!mResults) { std::lock_guard l(stdCoutLock); - std::cout << (mStr == OVERALL ? "Overall time: " : "Check time: " + mStr + ": ")<< TimerResultsData::durationToString(diff) << std::endl; + std::cout << (mType == Type::OVERALL ? "Overall time: " : "Check time: " + mName + ": ") << TimerResultsData::durationToString(diff) << std::endl; } else { - mTimerResults->addResults(mStr, diff); + mResults->addResults(mName, diff); } } - mShowTimeMode = ShowTime::NONE; // prevent multiple stops + mMode = ShowTime::NONE; // prevent multiple stops } std::string TimerResultsData::durationToString(std::chrono::milliseconds duration) diff --git a/lib/timer.h b/lib/timer.h index 27be8eb74de..ae686b7b3e7 100644 --- a/lib/timer.h +++ b/lib/timer.h @@ -74,11 +74,16 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf { class CPPCHECKLIB Timer { public: - static constexpr char OVERALL[] = "Summary"; using Clock = std::chrono::high_resolution_clock; using TimePoint = std::chrono::time_point; - Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults = nullptr); + enum class Type : std::uint8_t { + FILE, + OVERALL, + OTHER + }; + + Timer(std::string str, ShowTime showtimeMode, TimerResultsIntf* timerResults = nullptr, Type type = Type::OTHER); ~Timer(); Timer(const Timer&) = delete; @@ -92,10 +97,11 @@ class CPPCHECKLIB Timer { } private: - const std::string mStr; - TimerResultsIntf* mTimerResults{}; - ShowTime mShowTimeMode = ShowTime::FILE_TOTAL; - TimePoint mStartTimePoint; + const std::string mName; + ShowTime mMode{}; + Type mType{}; + TimePoint mStart; + TimerResultsIntf* mResults{}; }; //--------------------------------------------------------------------------- diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index 954b63287db..feb760e5381 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -242,8 +242,8 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = ShowTime::TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall - ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + overall + total + ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -253,7 +253,7 @@ class TestSingleExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + // once: top5 results + newline ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index 410c5a2c3d3..bb03c6a514c 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -234,8 +234,8 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = ShowTime::TOP5_FILE)); const std::string output_s = GET_REDIRECT_OUTPUT; - // for each file: top5 results + overall - ASSERT_EQUALS((5 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); + // for each file: top5 results + newline + overall + ASSERT_EQUALS((5 + 1 + 1) * 2LL, cppcheck::count_all_of(output_s, '\n')); } void showtime_top5_summary() { @@ -245,7 +245,7 @@ class TestThreadExecutorBase : public TestFixture { dinit(CheckOptions, $.showtime = ShowTime::TOP5_SUMMARY)); const std::string output_s = GET_REDIRECT_OUTPUT; - // once: top5 results + overall + // once: top5 results + newline ASSERT_EQUALS(5 + 1, cppcheck::count_all_of(output_s, '\n')); // should only report the top5 once ASSERT(output_s.find("1 result(s)") == std::string::npos); From ea16e4b4be4cf5bca97ec47cfebd11161689f4f4 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Wed, 5 Nov 2025 15:18:21 +0000 Subject: [PATCH 22/24] Test fix --- test/cli/other_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cli/other_test.py b/test/cli/other_test.py index 3f4a66a13a9..2f1c5092b3c 100644 --- a/test/cli/other_test.py +++ b/test/cli/other_test.py @@ -919,7 +919,6 @@ def test_showtime_top5_file(tmpdir): assert lines[i].endswith(' - 2 result(s))') else: assert lines[i].endswith(' result(s))') - assert lines[6].startswith('Overall time:') assert stderr == '' From 67a71be0a404ec41ef0421f8010c1d601135771e Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Thu, 6 Nov 2025 08:36:15 +0000 Subject: [PATCH 23/24] Small workaround --- lib/timer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/timer.cpp b/lib/timer.cpp index 1bea8771017..ccb616cccfd 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -138,5 +138,8 @@ std::string TimerResultsData::durationToString(std::chrono::milliseconds duratio if (minutes.count() > 0) ellapsedTime += std::to_string(minutes.count()) + "m "; std::string secondsStr{std::to_string(seconds.count())}; - return (ellapsedTime + secondsStr.substr(0, secondsStr.length() - 3) + "s"); + auto pos = secondsStr.find_first_of('.'); + if (pos != std::string::npos && (pos + 4) < secondsStr.size()) + secondsStr = secondsStr.substr(0, pos + 4); // keep three decimal + return (ellapsedTime + secondsStr + "s"); } From 6c036ca96e8d9055828e035e5857c112bbd7477d Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Thu, 6 Nov 2025 09:53:04 +0000 Subject: [PATCH 24/24] Nits --- lib/timer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/timer.cpp b/lib/timer.cpp index ccb616cccfd..5d64258be35 100644 --- a/lib/timer.cpp +++ b/lib/timer.cpp @@ -140,6 +140,6 @@ std::string TimerResultsData::durationToString(std::chrono::milliseconds duratio std::string secondsStr{std::to_string(seconds.count())}; auto pos = secondsStr.find_first_of('.'); if (pos != std::string::npos && (pos + 4) < secondsStr.size()) - secondsStr = secondsStr.substr(0, pos + 4); // keep three decimal + secondsStr.resize(pos + 4); // keep three decimal return (ellapsedTime + secondsStr + "s"); }