xref: /llvm-project/compiler-rt/test/asan/TestCases/Windows/aligned_mallocs.cpp (revision 3c1aa20c63548c77ddce3dabc7b25c7c7edccaac)
1*3c1aa20cSAlvin Wong // RUN: %clang_cl_asan %Od %s %Fe%t
2673dc3d4SNico Weber // RUN: %run %t
3673dc3d4SNico Weber 
4673dc3d4SNico Weber #include <windows.h>
5673dc3d4SNico Weber 
6*3c1aa20cSAlvin Wong #ifdef __MINGW32__
7*3c1aa20cSAlvin Wong // FIXME: remove after mingw-w64 adds this declaration.
8*3c1aa20cSAlvin Wong extern "C" size_t __cdecl _aligned_msize(void *_Memory, size_t _Alignment,
9*3c1aa20cSAlvin Wong                                          size_t _Offset);
10*3c1aa20cSAlvin Wong #endif
11*3c1aa20cSAlvin Wong 
12673dc3d4SNico Weber #define CHECK_ALIGNED(ptr,alignment) \
13673dc3d4SNico Weber   do { \
14673dc3d4SNico Weber     if (((uintptr_t)(ptr) % (alignment)) != 0) \
15673dc3d4SNico Weber       return __LINE__; \
16673dc3d4SNico Weber     } \
17673dc3d4SNico Weber   while(0)
18673dc3d4SNico Weber 
main(void)19673dc3d4SNico Weber int main(void) {
20673dc3d4SNico Weber   int *p = (int*)_aligned_malloc(1024 * sizeof(int), 32);
21673dc3d4SNico Weber   CHECK_ALIGNED(p, 32);
22673dc3d4SNico Weber   p[512] = 0;
23673dc3d4SNico Weber   _aligned_free(p);
24673dc3d4SNico Weber 
25673dc3d4SNico Weber   p = (int*)_aligned_malloc(128, 128);
26673dc3d4SNico Weber   CHECK_ALIGNED(p, 128);
27673dc3d4SNico Weber   p = (int*)_aligned_realloc(p, 2048 * sizeof(int), 128);
28673dc3d4SNico Weber   CHECK_ALIGNED(p, 128);
29673dc3d4SNico Weber   p[1024] = 0;
30673dc3d4SNico Weber   if (_aligned_msize(p, 128, 0) != 2048 * sizeof(int))
31673dc3d4SNico Weber     return __LINE__;
32673dc3d4SNico Weber   _aligned_free(p);
33673dc3d4SNico Weber 
34673dc3d4SNico Weber   return 0;
35673dc3d4SNico Weber }
36