aboutsummaryrefslogtreecommitdiff
path: root/libc/test/src
diff options
context:
space:
mode:
Diffstat (limited to 'libc/test/src')
-rw-r--r--libc/test/src/__support/CMakeLists.txt2
-rw-r--r--libc/test/src/__support/str_to_integer_test.cpp6
-rw-r--r--libc/test/src/__support/wcs_to_integer_test.cpp102
-rw-r--r--libc/test/src/time/strftime_test.cpp21
4 files changed, 78 insertions, 53 deletions
diff --git a/libc/test/src/__support/CMakeLists.txt b/libc/test/src/__support/CMakeLists.txt
index a025141..138866b 100644
--- a/libc/test/src/__support/CMakeLists.txt
+++ b/libc/test/src/__support/CMakeLists.txt
@@ -151,7 +151,7 @@ add_libc_test(
wcs_to_integer_test.cpp
DEPENDS
libc.src.__support.integer_literals
- libc.src.__support.wcs_to_integer
+ libc.src.__support.str_to_integer
)
add_libc_test(
diff --git a/libc/test/src/__support/str_to_integer_test.cpp b/libc/test/src/__support/str_to_integer_test.cpp
index 1ec882b..e5ac1d6 100644
--- a/libc/test/src/__support/str_to_integer_test.cpp
+++ b/libc/test/src/__support/str_to_integer_test.cpp
@@ -49,12 +49,14 @@ TEST(LlvmLibcStrToIntegerTest, LeadingSpaces) {
EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
ASSERT_EQ(result.value, 12);
- result = LIBC_NAMESPACE::internal::strtointeger<int>(" 12345", 10, 5);
+ // Use a non-null-terminated buffer to test for possible OOB access.
+ char buf[5] = {' ', ' ', ' ', ' ', ' '};
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(buf, 10, 5);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::strtointeger<int>(" 12345", 10, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(buf, 10, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
diff --git a/libc/test/src/__support/wcs_to_integer_test.cpp b/libc/test/src/__support/wcs_to_integer_test.cpp
index 4554968..38af778 100644
--- a/libc/test/src/__support/wcs_to_integer_test.cpp
+++ b/libc/test/src/__support/wcs_to_integer_test.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "src/__support/wcs_to_integer.h"
+#include "src/__support/str_to_integer.h"
#include <stddef.h>
#include "test/UnitTest/Test.h"
@@ -14,224 +14,226 @@
// This file is for testing the src_len argument and other internal interface
// features. Primary testing is done through the public interface.
-TEST(LlvmLibcStrToIntegerTest, SimpleLength) {
- auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"12345", 10, 10);
+TEST(LlvmLibcWcsToIntegerTest, SimpleLength) {
+ auto result = LIBC_NAMESPACE::internal::strtointeger<int>(L"12345", 10, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(5));
ASSERT_EQ(result.value, 12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"12345", 10, 2);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"12345", 10, 2);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(2));
ASSERT_EQ(result.value, 12);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"12345", 10, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"12345", 10, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
}
-TEST(LlvmLibcStrToIntegerTest, LeadingSpaces) {
+TEST(LlvmLibcWcsToIntegerTest, LeadingSpaces) {
auto result =
- LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 15);
+ LIBC_NAMESPACE::internal::strtointeger<int>(L" 12345", 10, 15);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(10));
ASSERT_EQ(result.value, 12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 10);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L" 12345", 10, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(10));
ASSERT_EQ(result.value, 12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 7);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L" 12345", 10, 7);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
ASSERT_EQ(result.value, 12);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 5);
+ // Use a non-null-terminated buffer to test for possible OOB access.
+ wchar_t buf[5] = {L' ', L' ', L' ', L' ', L' '};
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(buf, 10, 5);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" 12345", 10, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(buf, 10, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
}
-TEST(LlvmLibcStrToIntegerTest, LeadingSign) {
- auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 10);
+TEST(LlvmLibcWcsToIntegerTest, LeadingSign) {
+ auto result = LIBC_NAMESPACE::internal::strtointeger<int>(L"+12345", 10, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, 12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 10);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"-12345", 10, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, -12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 6);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"+12345", 10, 6);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, 12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 6);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"-12345", 10, 6);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, -12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 3);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"+12345", 10, 3);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(3));
ASSERT_EQ(result.value, 12);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 3);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"-12345", 10, 3);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(3));
ASSERT_EQ(result.value, -12);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 1);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"+12345", 10, 1);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 1);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"-12345", 10, 1);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"+12345", 10, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"+12345", 10, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"-12345", 10, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"-12345", 10, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
}
-TEST(LlvmLibcStrToIntegerTest, Base16PrefixAutoSelect) {
- auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 10);
+TEST(LlvmLibcWcsToIntegerTest, Base16PrefixAutoSelect) {
+ auto result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 0, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
ASSERT_EQ(result.value, 0x12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 7);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 0, 7);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
ASSERT_EQ(result.value, 0x12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 5);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 0, 5);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(5));
ASSERT_EQ(result.value, 0x123);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 2);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 0, 2);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 0, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 0, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
}
-TEST(LlvmLibcStrToIntegerTest, Base16PrefixManualSelect) {
- auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 10);
+TEST(LlvmLibcWcsToIntegerTest, Base16PrefixManualSelect) {
+ auto result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 16, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
ASSERT_EQ(result.value, 0x12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 7);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 16, 7);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(7));
ASSERT_EQ(result.value, 0x12345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 5);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 16, 5);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(5));
ASSERT_EQ(result.value, 0x123);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 2);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 16, 2);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"0x12345", 16, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"0x12345", 16, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
}
-TEST(LlvmLibcStrToIntegerTest, Base8PrefixAutoSelect) {
- auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 10);
+TEST(LlvmLibcWcsToIntegerTest, Base8PrefixAutoSelect) {
+ auto result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 0, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, 012345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 6);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 0, 6);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, 012345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 4);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 0, 4);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(4));
ASSERT_EQ(result.value, 0123);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 1);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 0, 1);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 0, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 0, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
}
-TEST(LlvmLibcStrToIntegerTest, Base8PrefixManualSelect) {
- auto result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 10);
+TEST(LlvmLibcWcsToIntegerTest, Base8PrefixManualSelect) {
+ auto result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 8, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, 012345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 6);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 8, 6);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, 012345);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 4);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 8, 4);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(4));
ASSERT_EQ(result.value, 0123);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 1);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 8, 1);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(1));
ASSERT_EQ(result.value, 0);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L"012345", 8, 0);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L"012345", 8, 0);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(0));
ASSERT_EQ(result.value, 0);
}
-TEST(LlvmLibcStrToIntegerTest, CombinedTests) {
+TEST(LlvmLibcWcsToIntegerTest, CombinedTests) {
auto result =
- LIBC_NAMESPACE::internal::wcstointeger<int>(L" -0x123", 0, 10);
+ LIBC_NAMESPACE::internal::strtointeger<int>(L" -0x123", 0, 10);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(10));
ASSERT_EQ(result.value, -0x123);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" -0x123", 0, 8);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L" -0x123", 0, 8);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(8));
ASSERT_EQ(result.value, -0x1);
- result = LIBC_NAMESPACE::internal::wcstointeger<int>(L" -0x123", 0, 7);
+ result = LIBC_NAMESPACE::internal::strtointeger<int>(L" -0x123", 0, 7);
EXPECT_FALSE(result.has_error());
EXPECT_EQ(result.parsed_len, ptrdiff_t(6));
ASSERT_EQ(result.value, 0);
diff --git a/libc/test/src/time/strftime_test.cpp b/libc/test/src/time/strftime_test.cpp
index cac7560..52221527 100644
--- a/libc/test/src/time/strftime_test.cpp
+++ b/libc/test/src/time/strftime_test.cpp
@@ -2326,3 +2326,24 @@ TEST(LlvmLibcStrftimeTest, TimeFormatFullDateTime) {
// size_t written = 0;
// SimplePaddedNum spn;
// }
+
+TEST(LlvmLibcStrftimeTest, BufferTooSmall) {
+ struct tm time;
+ char tiny_buffer[1];
+
+ time.tm_year = get_adjusted_year(2025);
+ time.tm_mon = 10;
+ time.tm_mday = 24;
+
+ size_t written =
+ LIBC_NAMESPACE::strftime(tiny_buffer, sizeof(tiny_buffer), "%F", &time);
+ EXPECT_EQ(written, size_t{0});
+
+ char small_buffer[10];
+
+ // The string "2025-11-24" is 10 chars,
+ // so strftime needs 10 + 1 bytes to write the string and the null terminator.
+ written =
+ LIBC_NAMESPACE::strftime(small_buffer, sizeof(small_buffer), "%F", &time);
+ EXPECT_EQ(written, size_t{0});
+}