Merge pull request #1994 from posidron:windows-coverage-support

PiperOrigin-RevId: 885592751
diff --git a/fuzztest/internal/coverage.cc b/fuzztest/internal/coverage.cc
index 43c25d7..20deebc 100644
--- a/fuzztest/internal/coverage.cc
+++ b/fuzztest/internal/coverage.cc
@@ -23,6 +23,10 @@
 #include <memory>
 #include <type_traits>
 
+#if defined(_WIN32)
+#include <malloc.h>  // For _aligned_malloc / _aligned_free.
+#endif
+
 #include "absl/base/attributes.h"
 #include "absl/strings/str_format.h"
 #include "absl/types/span.h"
@@ -173,15 +177,15 @@
   }
 }
 
-// Coverage only available in Clang, but only for Linux, macOS, and newer
-// versions of Android. Windows might not have what we need.
+// Coverage only available in Clang for Linux, macOS, newer versions of
+// Android, and Windows (clang-cl).
 #if /* Supported compilers */                         \
     defined(__clang__) &&                             \
     (/* Supported platforms */                        \
      (defined(__linux__) && !defined(__ANDROID__)) || \
      (defined(__ANDROID_MIN_SDK_VERSION__) &&         \
       __ANDROID_MIN_SDK_VERSION__ >= 28) ||           \
-     defined(__APPLE__))
+     defined(__APPLE__) || defined(_WIN32))
 #define FUZZTEST_COVERAGE_IS_AVAILABLE
 #endif
 
@@ -281,11 +285,21 @@
   // necessary space.
   map_size += alignment;
   corpus_map_size_ = map_size;
+#if defined(_WIN32)
+  corpus_map_ = static_cast<uint8_t*>(_aligned_malloc(map_size, alignment));
+#else
   corpus_map_ = static_cast<uint8_t*>(std::aligned_alloc(alignment, map_size));
+#endif
   std::fill(corpus_map_, corpus_map_ + corpus_map_size_, 0);
 }
 
-CorpusCoverage::~CorpusCoverage() { std::free(corpus_map_); }
+CorpusCoverage::~CorpusCoverage() {
+#if defined(_WIN32)
+  _aligned_free(corpus_map_);
+#else
+  std::free(corpus_map_);
+#endif
+}
 
 bool CorpusCoverage::Update(ExecutionCoverage* execution_coverage) {
   absl::Span<uint8_t> execution_map = execution_coverage->GetCounterMap();