Skip to content

Commit c2dd9a2

Browse files
committed
Update CHANGELOG for v1.0.3; Fix crash on empty string_view logging; Add unit test for empty string_view
1 parent 09c92ec commit c2dd9a2

5 files changed

Lines changed: 46 additions & 7 deletions

File tree

CHANGELOG

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# v1.0.3 - 01-08-2026
2+
- Fix crash when logging empty string_view values
3+
- Add length check before memcpy in store_string_in_queue() to handle empty strings safely
4+
- Set null terminator directly for zero-length strings instead of copying
5+
- Add comprehensive unit test for empty string_view logging (EmptyStringView test)
6+
17
# v1.0.2 - 01-03-2026
28
- Update slick_queue to v1.2.1
39
- Added GitHub release workflow

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.20)
22

33
project(slick_logger
4-
VERSION 1.0.2
4+
VERSION 1.0.3
55
LANGUAGES CXX)
66

77
set(CMAKE_CXX_STANDARD 20)

include/slick/logger.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,10 +1576,15 @@ inline StringRef Logger::store_string_in_queue(std::string_view str) {
15761576

15771577
// Reserve space in string queue
15781578
uint64_t start_index = string_queue_->reserve(len);
1579-
// Copy string data
1580-
char* dest = (*string_queue_)[start_index];
1581-
std::memcpy(dest, str.data(), len);
15821579

1580+
char* dest = (*string_queue_)[start_index];
1581+
if (length) {
1582+
// Copy string data
1583+
std::memcpy(dest, str.data(), len);
1584+
}
1585+
else {
1586+
*dest = '\0';
1587+
}
15831588
// Publish the string data
15841589
string_queue_->publish(start_index, len);
15851590
return StringRef{dest, length};

src/logger.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,10 +1574,15 @@ inline StringRef Logger::store_string_in_queue(std::string_view str) {
15741574

15751575
// Reserve space in string queue
15761576
uint64_t start_index = string_queue_->reserve(len);
1577-
// Copy string data
1578-
char* dest = (*string_queue_)[start_index];
1579-
std::memcpy(dest, str.data(), len);
15801577

1578+
char* dest = (*string_queue_)[start_index];
1579+
if (length) {
1580+
// Copy string data
1581+
std::memcpy(dest, str.data(), len);
1582+
}
1583+
else {
1584+
*dest = '\0';
1585+
}
15811586
// Publish the string data
15821587
string_queue_->publish(start_index, len);
15831588
return StringRef{dest, length};

tests/test_logger.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class SlickLoggerTest : public ::testing::Test {
1717
std::filesystem::remove("test_mixed.log");
1818
std::filesystem::remove("test_char_array.log");
1919
std::filesystem::remove("test_single_string.log");
20+
std::filesystem::remove("test_empty_string.log");
2021
}
2122
};
2223

@@ -347,6 +348,28 @@ TEST_F(SlickLoggerTest, CharArrayLogging) {
347348
EXPECT_TRUE(file_contents.find("Log char array: test char array") != std::string::npos);
348349
}
349350

351+
TEST_F(SlickLoggerTest, EmptyStringView) {
352+
std::filesystem::remove("test_empty_string.log");
353+
354+
slick::logger::Logger::instance().init("test_empty_string.log", 8);
355+
356+
std::string_view s;
357+
358+
LOG_INFO("Log empty string: {}", s);
359+
360+
slick::logger::Logger::instance().shutdown();
361+
362+
ASSERT_TRUE(std::filesystem::exists("test_empty_string.log"));
363+
364+
std::ifstream log_file("test_empty_string.log");
365+
std::string line;
366+
std::getline(log_file, line); // first line is the logger's version
367+
EXPECT_TRUE(std::getline(log_file, line));
368+
// Check valid formats work
369+
EXPECT_EQ(line.size(), 52);
370+
EXPECT_EQ(line.find(" [INFO] Log empty string: "), 26);
371+
}
372+
350373
int main(int argc, char **argv) {
351374
testing::InitGoogleTest(&argc, argv);
352375
return RUN_ALL_TESTS();

0 commit comments

Comments
 (0)