From b638c71d262e296e8a7dd490fa2311006475495a Mon Sep 17 00:00:00 2001 From: Oleksii Mandrychenko Date: Wed, 29 Mar 2017 11:27:59 +0100 Subject: [PATCH 1/6] [#404] Reading past valid address with multisink logger - Initialising atomic value See examples at http://stackoverflow.com/q/36320008/706456 This issue was discovered with dr memory tool on Windows platform, Visual Studio 2015 C++ 11 --- include/spdlog/logger.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index 58b4841a..aec1d203 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -87,7 +87,7 @@ protected: spdlog::level_t _level; spdlog::level_t _flush_level; log_err_handler _err_handler; - std::atomic _last_err_time; + std::atomic _last_err_time {0}; // init atomic value to avoid reads of uninitialised memory }; } From 6a41bc40af0d6f060e7b47838bd8126081f1e155 Mon Sep 17 00:00:00 2001 From: Oleksii Mandrychenko Date: Wed, 29 Mar 2017 13:53:11 +0100 Subject: [PATCH 2/6] [#404] Reading past valid address with multisink logger - Initialising atomic value See examples at http://stackoverflow.com/q/36320008/706456 This issue was discovered with dr memory tool on Windows platform, Visual Studio 2015 C++ 11 --- include/spdlog/details/mpmc_bounded_q.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/spdlog/details/mpmc_bounded_q.h b/include/spdlog/details/mpmc_bounded_q.h index 3a46e8eb..c963bc93 100644 --- a/include/spdlog/details/mpmc_bounded_q.h +++ b/include/spdlog/details/mpmc_bounded_q.h @@ -159,9 +159,9 @@ private: cell_t* const buffer_; size_t const buffer_mask_; cacheline_pad_t pad1_; - std::atomic enqueue_pos_; + std::atomic enqueue_pos_ {0}; cacheline_pad_t pad2_; - std::atomic dequeue_pos_; + std::atomic dequeue_pos_ {0}; cacheline_pad_t pad3_; mpmc_bounded_queue(mpmc_bounded_queue const&) = delete; From b5d838cc32a7fe4eec0b4c94ce7c0f48d064a733 Mon Sep 17 00:00:00 2001 From: Oleksii Mandrychenko Date: Wed, 29 Mar 2017 16:04:24 +0100 Subject: [PATCH 3/6] - Reverting changes to mpmc queue --- include/spdlog/details/mpmc_bounded_q.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/spdlog/details/mpmc_bounded_q.h b/include/spdlog/details/mpmc_bounded_q.h index c963bc93..3a46e8eb 100644 --- a/include/spdlog/details/mpmc_bounded_q.h +++ b/include/spdlog/details/mpmc_bounded_q.h @@ -159,9 +159,9 @@ private: cell_t* const buffer_; size_t const buffer_mask_; cacheline_pad_t pad1_; - std::atomic enqueue_pos_ {0}; + std::atomic enqueue_pos_; cacheline_pad_t pad2_; - std::atomic dequeue_pos_ {0}; + std::atomic dequeue_pos_; cacheline_pad_t pad3_; mpmc_bounded_queue(mpmc_bounded_queue const&) = delete; From d315bba1f8234b812a025be356a096d0df55da8f Mon Sep 17 00:00:00 2001 From: Oleksii Mandrychenko Date: Wed, 29 Mar 2017 16:06:59 +0100 Subject: [PATCH 4/6] Initialising members via constructor --- include/spdlog/details/logger_impl.h | 8 ++++---- include/spdlog/logger.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h index 5bb85f67..c712b27a 100644 --- a/include/spdlog/details/logger_impl.h +++ b/include/spdlog/details/logger_impl.h @@ -18,11 +18,11 @@ template inline spdlog::logger::logger(const std::string& logger_name, const It& begin, const It& end): _name(logger_name), _sinks(begin, end), - _formatter(std::make_shared("%+")) + _formatter(std::make_shared("%+")), + _level(level::info), + _flush_level(level::off), + _last_err_time(0) { - _level = level::info; - _flush_level = level::off; - _last_err_time = 0; _err_handler = [this](const std::string &msg) { this->_default_err_handler(msg); diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index aec1d203..58b4841a 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -87,7 +87,7 @@ protected: spdlog::level_t _level; spdlog::level_t _flush_level; log_err_handler _err_handler; - std::atomic _last_err_time {0}; // init atomic value to avoid reads of uninitialised memory + std::atomic _last_err_time; }; } From a3e84cb347c9d201260712868a2ce456c004c4f7 Mon Sep 17 00:00:00 2001 From: Elias Kosunen Date: Wed, 29 Mar 2017 22:28:37 +0300 Subject: [PATCH 5/6] Update example in README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f5e5fe34..c1a74489 100644 --- a/README.md +++ b/README.md @@ -149,13 +149,13 @@ int main(int, char*[]) err_handler_example(); // Apply a function on all registered loggers - spd::apply_all([&](std::shared_ptr l) + spd::apply_all([&](std::shared_ptr l) { l->info("End of example."); }); // Release and close all loggers - spdlog::drop_all(); + spd::drop_all(); } // Exceptions will only be thrown upon failed logger or sink construction (not during logging) catch (const spd::spdlog_ex& ex) @@ -168,7 +168,7 @@ int main(int, char*[]) void async_example() { size_t q_size = 4096; //queue size must be power of 2 - spdlog::set_async_mode(q_size); + spd::set_async_mode(q_size); auto async_file = spd::daily_logger_st("async_file_logger", "logs/async_log.txt"); for (int i = 0; i < 100; ++i) async_file->info("Async message #{}", i); @@ -206,7 +206,7 @@ void user_defined_example() // void err_handler_example() { - spdlog::set_error_handler([](const std::string& msg) { + spd::set_error_handler([](const std::string& msg) { std::cerr << "my err handler: " << msg << std::endl; }); // (or logger->set_error_handler(..) to set for specific logger) From ea359254d67511aeb897aec53c3c09daf5d9e503 Mon Sep 17 00:00:00 2001 From: odeits Date: Wed, 29 Mar 2017 15:53:14 -0400 Subject: [PATCH 6/6] Fix typo Unkown to Unknown --- include/spdlog/details/os.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index b63ce667..4d9f60a5 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -375,7 +375,7 @@ inline std::string errno_str(int err_num) if(strerror_s(buf, buf_size, err_num) == 0) return std::string(buf); else - return "Unkown error"; + return "Unknown error"; #elif defined(__FreeBSD__) || defined(__APPLE__) || defined(ANDROID) || defined(__SUNPRO_CC) || \ ((_POSIX_C_SOURCE >= 200112L) && ! defined(_GNU_SOURCE)) // posix version @@ -383,7 +383,7 @@ inline std::string errno_str(int err_num) if (strerror_r(err_num, buf, buf_size) == 0) return std::string(buf); else - return "Unkown error"; + return "Unknown error"; #else // gnu version (might not use the given buf, so its retval pointer must be used) return std::string(strerror_r(err_num, buf, buf_size));