diff --git a/libc/src/wchar/CMakeLists.txt b/libc/src/wchar/CMakeLists.txt index 43f571fed91af..fdcaeaf547317 100644 --- a/libc/src/wchar/CMakeLists.txt +++ b/libc/src/wchar/CMakeLists.txt @@ -67,4 +67,5 @@ add_entrypoint_object( libc.hdr.types.size_t libc.hdr.wchar_macros libc.src.__support.wctype_utils + libc.src.__support.macros.null_check ) diff --git a/libc/src/wchar/wmemcmp.cpp b/libc/src/wchar/wmemcmp.cpp index f2fa361c69798..374f3d5ddb627 100644 --- a/libc/src/wchar/wmemcmp.cpp +++ b/libc/src/wchar/wmemcmp.cpp @@ -12,11 +12,14 @@ #include "hdr/types/wchar_t.h" #include "src/__support/common.h" #include "src/__support/macros/config.h" +#include "src/__support/macros/null_check.h" // LIBC_CRASH_ON_NULLPTR namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(int, wmemcmp, (const wchar_t *s1, const wchar_t *s2, size_t n)) { + LIBC_CRASH_ON_NULLPTR(s1); + LIBC_CRASH_ON_NULLPTR(s2); for (size_t i = 0; i < n; ++i) { if (s1[i] != s2[i]) return (int)(s1[i] - s2[i]); diff --git a/libc/test/src/wchar/wmemcmp_test.cpp b/libc/test/src/wchar/wmemcmp_test.cpp index 536299fd7daf0..5b07ca7396e97 100644 --- a/libc/test/src/wchar/wmemcmp_test.cpp +++ b/libc/test/src/wchar/wmemcmp_test.cpp @@ -66,3 +66,13 @@ TEST(LlvmLibcWMemcmpTest, LhsRhsAreTheSameLong) { const wchar_t *rhs = L"aaaaaaaaaaaaaa"; EXPECT_EQ(LIBC_NAMESPACE::wmemcmp(lhs, rhs, 15), 0); } + +#if defined(LIBC_ADD_NULL_CHECKS) && !defined(LIBC_HAS_SANITIZER) +TEST(LlvmLibcWMemcmpTest, NullptrCrash) { + // Passing in a nullptr should crash the program. + EXPECT_DEATH([] { LIBC_NAMESPACE::wmemcmp(L"aaaaaaaaaaaaaa", nullptr, 15); }, + WITH_SIGNAL(-1)); + EXPECT_DEATH([] { LIBC_NAMESPACE::wmemcmp(nullptr, L"aaaaaaaaaaaaaa", 15); }, + WITH_SIGNAL(-1)); +} +#endif // LIBC_HAS_ADDRESS_SANITIZER