From: Remi Gacogne Date: Thu, 2 Nov 2023 08:40:21 +0000 (+0100) Subject: dnsdist: Fix Coverity CID 1523748: Performance inefficiencies in dolog.hh X-Git-Tag: rec-5.0.0-beta1~12^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e01b698ef441ff4961f8703246f2f7274b8ae7d;p=thirdparty%2Fpdns.git dnsdist: Fix Coverity CID 1523748: Performance inefficiencies in dolog.hh Coverity reports: ``` Performance inefficiencies (COPY_INSTEAD_OF_MOVE): "args" is passed-by-value as parameter to "dolog" when it could be moved instead. ``` This PR implements perfect forwarding for the variadic template parameters of DNSdist's logging methods to address it, even though the performance of these functions should not matter much. --- diff --git a/pdns/dolog.hh b/pdns/dolog.hh index a28777ab81..b94edb2507 100644 --- a/pdns/dolog.hh +++ b/pdns/dolog.hh @@ -58,7 +58,7 @@ inline void dolog(std::ostream& os, const char*s) } template -void dolog(std::ostream& os, const char* s, T value, Args... args) +void dolog(std::ostream& os, const char* s, T value, Args&&... args) { while (*s) { if (*s == '%') { @@ -68,7 +68,7 @@ void dolog(std::ostream& os, const char* s, T value, Args... args) else { os << value; s += 2; - dolog(os, s, args...); + dolog(os, s, std::forward(args)...); return; } } @@ -91,10 +91,10 @@ inline void setSyslogFacility(int facility) } template -void genlog(std::ostream& stream, int level, bool doSyslog, const char* s, Args... args) +void genlog(std::ostream& stream, int level, bool doSyslog, const char* s, Args&&... args) { std::ostringstream str; - dolog(str, s, args...); + dolog(str, s, std::forward(args)...); auto output = str.str(); @@ -120,15 +120,15 @@ void genlog(std::ostream& stream, int level, bool doSyslog, const char* s, Args. } template -void verboselog(const char* s, Args... args) +void verboselog(const char* s, Args&&... args) { #ifdef DNSDIST if (g_verboseStream) { - genlog(*g_verboseStream, LOG_DEBUG, false, s, args...); + genlog(*g_verboseStream, LOG_DEBUG, false, s, std::forward(args)...); } else { #endif /* DNSDIST */ - genlog(std::cout, LOG_DEBUG, g_syslog, s, args...); + genlog(std::cout, LOG_DEBUG, g_syslog, s, std::forward(args)...); #ifdef DNSDIST } #endif /* DNSDIST */ @@ -137,21 +137,21 @@ void verboselog(const char* s, Args... args) #define vinfolog if (g_verbose) verboselog template -void infolog(const char* s, Args... args) +void infolog(const char* s, Args&&... args) { - genlog(std::cout, LOG_INFO, g_syslog, s, args...); + genlog(std::cout, LOG_INFO, g_syslog, s, std::forward(args)...); } template -void warnlog(const char* s, Args... args) +void warnlog(const char* s, Args&&... args) { - genlog(std::cout, LOG_WARNING, g_syslog, s, args...); + genlog(std::cout, LOG_WARNING, g_syslog, s, std::forward(args)...); } template -void errlog(const char* s, Args... args) +void errlog(const char* s, Args&&... args) { - genlog(std::cout, LOG_ERR, g_syslog, s, args...); + genlog(std::cout, LOG_ERR, g_syslog, s, std::forward(args)...); } #else // RECURSOR @@ -169,7 +169,7 @@ inline void dolog(const char* s) } template -void dolog(Logger::Urgency u, const char* s, T value, Args... args) +void dolog(Logger::Urgency u, const char* s, T value, Args&&... args) { g_log << u; while (*s) { @@ -180,7 +180,7 @@ void dolog(Logger::Urgency u, const char* s, T value, Args... args) else { g_log << value; s += 2; - dolog(s, args...); + dolog(s, std::forward(args)...); return; } } @@ -191,21 +191,21 @@ void dolog(Logger::Urgency u, const char* s, T value, Args... args) #define vinfolog if(g_verbose)infolog template -void infolog(const char* s, Args... args) +void infolog(const char* s, Args&&... args) { - dolog(Logger::Info, s, args...); + dolog(Logger::Info, s, std::forward(args)...); } template -void warnlog(const char* s, Args... args) +void warnlog(const char* s, Args&&... args) { - dolog(Logger::Warning, s, args...); + dolog(Logger::Warning, s, std::forward(args)...); } template -void errlog(const char* s, Args... args) +void errlog(const char* s, Args&&... args) { - dolog(Logger::Error, s, args...); + dolog(Logger::Error, s, std::forward(args)...); } #endif