From 28f50d0badd8471e8ae3221ecd2ac9338ffa9bd3 Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Sat, 21 Sep 2024 11:07:51 +0200 Subject: [PATCH 1/2] fix(depth): handle underflow gracefully If asked for stripping more calls than the actual depth, clutchlog was going in an infinite loop. --- clutchlog/clutchlog.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index eeace5a..764529d 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -1333,7 +1333,10 @@ class clutchlog row = replace(row, "\\{level_short\\}", _level_short.at(stage)); #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 - size_t actual_depth = depth - _strip_calls; + size_t actual_depth = 0; + if( _strip_calls < depth) { + actual_depth = depth - _strip_calls; + } row = replace(row, "\\{name\\}", name); row = replace(row, "\\{depth\\}", actual_depth); @@ -1358,6 +1361,7 @@ class clutchlog row = replace(row, "\\{depth_marks\\}", chevrons.str()); } #endif + row = replace(row, "\\{level_fmt\\}", _level_fmt.at(stage).str()); row = replace(row, "\\{filehash_fmt\\}", fmt::hash(file, _filehash_fmts).str() ); row = replace(row, "\\{funchash_fmt\\}", fmt::hash(func, _funchash_fmts).str() ); From c8d148cf97eb8921a4f3e6df1a4fe45ca87b2f76 Mon Sep 17 00:00:00 2001 From: Johann Dreo Date: Tue, 1 Oct 2024 09:47:23 +0200 Subject: [PATCH 2/2] fix(depth): avoid overflow when manually setting depth Setting the depth to INTMAX was overflowing if strep calls was also set, resulting in no log triggered. --- clutchlog/clutchlog.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/clutchlog/clutchlog.h b/clutchlog/clutchlog.h index 764529d..9a2c57f 100644 --- a/clutchlog/clutchlog.h +++ b/clutchlog/clutchlog.h @@ -32,6 +32,7 @@ #define CLUTCHLOG_HAVE_UNIX_SYSINFO 1 #else #define CLUTCHLOG_HAVE_UNIX_SYSINFO 0 + // #pragma message("[clutchlog] no POSIX SYSINFO header") #endif //! True if the system can handle the `hfill` feature. @@ -42,6 +43,7 @@ #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 1 #else #define CLUTCHLOG_HAVE_UNIX_SYSIOCTL 0 + // #pragma message("[clutchlog] no POSIX SYSIOCTL header") #endif @@ -52,7 +54,12 @@ #ifndef NDEBUG //! Actually enable clutchlog features. #define WITH_CLUTCHLOG + // #pragma message("[clutchlog] automatically enabled") + // #else + // #pragma message("[clutchlog] automatically disabled") #endif +// #else + // #pragma message("[clutchlog] manually enabled") #endif /********************************************************************** @@ -171,6 +178,7 @@ #define CLUTCHDUMP( LEVEL, CONTAINER, FILENAME ) do {/*nothing*/} while(0) #define CLUTCHFUNC( LEVEL, FUNC, ... ) do {/*nothing*/} while(0) #define CLUTCHCODE( LEVEL, CODE ) do {/*nothing*/} while(0) + // #pragma message("[clutchlog] fully disabled") #endif // WITH_CLUTCHLOG /********************************************************************** @@ -999,7 +1007,9 @@ class clutchlog #if CLUTCHLOG_HAVE_UNIX_SYSINFO == 1 //! Set the stack depth above which logs are not printed. - void depth(size_t d) {_depth = d;} + void depth(size_t d) { + _depth = std::min(d, std::numeric_limits::max() - _strip_calls); + } //! Get the stack depth above which logs are not printed. size_t depth() const {return _depth;}