66//
77// ===----------------------------------------------------------------------===//
88
9+ #include " src/__support/CPP/limits.h"
910#include " src/__support/CPP/type_traits.h"
1011#include " src/__support/FPUtil/FPBits.h"
1112#include " test/UnitTest/Test.h"
13+ #include " test/UnitTest/ErrnoCheckingTest.h"
14+ #include " test/UnitTest/ErrnoSetterMatcher.h"
1215
1316#define ASSERT_STREQ_LEN (actual_written, actual_str, expected_str ) \
1417 EXPECT_EQ (actual_written, static_cast <int >(sizeof (expected_str) - 1)); \
1518 EXPECT_STREQ (actual_str, expected_str);
1619
1720template <typename InputT>
18- class StrfromTest : public LIBC_NAMESPACE ::testing::Test {
21+ class StrfromTest : public LIBC_NAMESPACE ::testing::ErrnoCheckingTest {
1922
2023 static constexpr bool is_single_prec =
2124 LIBC_NAMESPACE::cpp::is_same<InputT, float >::value;
@@ -481,6 +484,16 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
481484 written = func (buff, 10 , " %A" , -ld_nan);
482485 ASSERT_STREQ_LEN (written, buff, " -NAN" );
483486 }
487+
488+ void charsWrittenOverflow (FunctionT func) {
489+ char buff[100 ];
490+ // Trigger an overflow in the return value of strfrom by writing more than
491+ // INT_MAX bytes.
492+ int result = func (buff, sizeof (buff), " %.2147483647f" , 1 .0f );
493+
494+ EXPECT_LT (result, 0 );
495+ ASSERT_ERRNO_EQ (EOVERFLOW);
496+ }
484497};
485498
486499#define STRFROM_TEST (InputType, name, func ) \
@@ -501,4 +514,7 @@ class StrfromTest : public LIBC_NAMESPACE::testing::Test {
501514 TEST_F (LlvmLibc##name##Test, InsufficientBufferSize) { \
502515 insufficentBufsize (func); \
503516 } \
504- TEST_F (LlvmLibc##name##Test, InfAndNanValues) { infNanValues (func); }
517+ TEST_F (LlvmLibc##name##Test, InfAndNanValues) { infNanValues (func); } \
518+ TEST_F (LlvmLibc##name##Test, CharsWrittenOverflow) { \
519+ charsWrittenOverflow (func); \
520+ }
0 commit comments