Skip to content

Commit 9f04bfc

Browse files
Tamir Dubersteinfacebook-github-bot
Tamir Duberstein
authored andcommitted
Use std::aligned_alloc on all non-CRT platforms
Summary: The current feature detection seems to be incorrect, resulting in fallback to the manual implementation, which in turn returns untagged pointers under hwasan. Replace the feature detection with a check on `__cplusplus`. Remove rounding shenanigans while I'm here; the documentation on ET_ALIGNED_ALLOC already stipulates that the caller is responsible for such rounding. Differential Revision: D75806635
1 parent 8e2737c commit 9f04bfc

File tree

2 files changed

+12
-30
lines changed

2 files changed

+12
-30
lines changed

extension/data_loader/file_descriptor_data_loader.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,10 @@ Result<FreeableBuffer> FileDescriptorDataLoader::load(
164164
if (aligned_buffer == nullptr) {
165165
ET_LOG(
166166
Error,
167-
"Reading from %s at offset %zu: ET_ALIGNED_ALLOC(%zd) failed",
167+
"Reading from %s at offset %zu: ET_ALIGNED_ALLOC(%zd, %zd) failed",
168168
file_descriptor_uri_,
169169
offset,
170+
alignment_,
170171
size);
171172
return Error::MemoryAllocationFailed;
172173
}

runtime/platform/compiler.h

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -182,38 +182,20 @@ using ssize_t = ptrdiff_t;
182182
* Note: alignment must be a power of 2 and size must be an integral multiple of
183183
* alignment.
184184
*/
185+
#include <cstdlib>
185186
#if defined(_MSC_VER)
186-
#include <malloc.h>
187-
#define ET_ALIGNED_ALLOC(alignment, size) \
188-
_aligned_malloc(((size + alignment - 1) & ~(alignment - 1)), (alignment))
187+
#define ET_ALIGNED_ALLOC(alignment, size) _aligned_malloc((size), (alignment))
189188
#define ET_ALIGNED_FREE(ptr) _aligned_free(ptr)
190-
#elif defined(__APPLE__)
191-
#include <stdlib.h> // For posix_memalign and free
192-
inline void* et_apple_aligned_alloc(size_t alignment, size_t size) {
193-
void* ptr = nullptr;
194-
// The address of the allocated memory must be a multiple of sizeof(void*).
195-
if (alignment < sizeof(void*)) {
196-
alignment = sizeof(void*);
197-
}
198-
if (posix_memalign(
199-
&ptr, alignment, (size + alignment - 1) & ~(alignment - 1)) != 0) {
200-
return nullptr;
201-
}
202-
return ptr;
203-
}
204-
#define ET_ALIGNED_ALLOC(alignment, size) \
205-
et_apple_aligned_alloc((alignment), (size))
206-
#define ET_ALIGNED_FREE(ptr) free(ptr)
207-
#elif __has_builtin(__builtin_aligned_alloc) || defined(_ISOC11_SOURCE)
208-
// Linux and posix systems that support aligned_alloc and are >= C++17.
209-
#include <cstdlib>
210-
#define ET_ALIGNED_ALLOC(alignment, size) \
211-
::aligned_alloc(alignment, (size + alignment - 1) & ~(alignment - 1))
212-
#define ET_ALIGNED_FREE(ptr) free(ptr)
189+
#elif __cplusplus >= 201703L
190+
#define ET_ALIGNED_ALLOC(alignment, size) std::aligned_alloc((size), (alignment))
191+
#define ET_ALIGNED_FREE(ptr) std::free(ptr)
213192
#else
193+
#if defined(__has_feature) && __has_feature(hwaddress_sanitizer)
194+
#error native aligned allocation is not available on this platform, and the fallback is not compatible with HWASAN.
195+
#endif
196+
214197
// If the platform doesn't support aligned_alloc, fallback to malloc.
215-
#include <stdint.h>
216-
#include <cstdlib>
198+
#include <cstdint>
217199
inline void* et_aligned_malloc(size_t alignment, size_t size) {
218200
// Place to store the offset to the original pointer.
219201
size_t offset_size = sizeof(uint16_t);
@@ -263,7 +245,6 @@ inline void et_aligned_free(void* ptr) {
263245

264246
#define ET_ALIGNED_ALLOC(alignment, size) et_aligned_malloc((alignment), (size))
265247
#define ET_ALIGNED_FREE(ptr) et_aligned_free(ptr)
266-
267248
#endif
268249

269250
// DEPRECATED: Use the non-underscore-prefixed versions instead.

0 commit comments

Comments
 (0)