1//===-- tsan_mman_test.cc -------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is a part of ThreadSanitizer (TSan), a race detector. 11// 12//===----------------------------------------------------------------------===// 13#include "tsan_mman.h" 14#include "tsan_rtl.h" 15#include "gtest/gtest.h" 16 17namespace __tsan { 18 19TEST(Mman, Internal) { 20 ScopedInRtl in_rtl; 21 char *p = (char*)internal_alloc(MBlockScopedBuf, 10); 22 EXPECT_NE(p, (char*)0); 23 char *p2 = (char*)internal_alloc(MBlockScopedBuf, 20); 24 EXPECT_NE(p2, (char*)0); 25 EXPECT_NE(p2, p); 26 for (int i = 0; i < 10; i++) { 27 p[i] = 42; 28 } 29 for (int i = 0; i < 20; i++) { 30 ((char*)p2)[i] = 42; 31 } 32 internal_free(p); 33 internal_free(p2); 34} 35 36TEST(Mman, User) { 37 ScopedInRtl in_rtl; 38 ThreadState *thr = cur_thread(); 39 uptr pc = 0; 40 char *p = (char*)user_alloc(thr, pc, 10); 41 EXPECT_NE(p, (char*)0); 42 char *p2 = (char*)user_alloc(thr, pc, 20); 43 EXPECT_NE(p2, (char*)0); 44 EXPECT_NE(p2, p); 45 MBlock *b = user_mblock(thr, p); 46 EXPECT_NE(b, (MBlock*)0); 47 EXPECT_EQ(b->size, (uptr)10); 48 MBlock *b2 = user_mblock(thr, p2); 49 EXPECT_NE(b2, (MBlock*)0); 50 EXPECT_EQ(b2->size, (uptr)20); 51 for (int i = 0; i < 10; i++) { 52 p[i] = 42; 53 EXPECT_EQ(b, user_mblock(thr, p + i)); 54 } 55 for (int i = 0; i < 20; i++) { 56 ((char*)p2)[i] = 42; 57 EXPECT_EQ(b2, user_mblock(thr, p2 + i)); 58 } 59 user_free(thr, pc, p); 60 user_free(thr, pc, p2); 61} 62 63TEST(Mman, UserRealloc) { 64 ScopedInRtl in_rtl; 65 ThreadState *thr = cur_thread(); 66 uptr pc = 0; 67 { 68 void *p = user_realloc(thr, pc, 0, 0); 69 // Strictly saying this is incorrect, realloc(NULL, N) is equivalent to 70 // malloc(N), thus must return non-NULL pointer. 71 EXPECT_EQ(p, (void*)0); 72 } 73 { 74 void *p = user_realloc(thr, pc, 0, 100); 75 EXPECT_NE(p, (void*)0); 76 memset(p, 0xde, 100); 77 user_free(thr, pc, p); 78 } 79 { 80 void *p = user_alloc(thr, pc, 100); 81 EXPECT_NE(p, (void*)0); 82 memset(p, 0xde, 100); 83 void *p2 = user_realloc(thr, pc, p, 0); 84 EXPECT_EQ(p2, (void*)0); 85 } 86 { 87 void *p = user_realloc(thr, pc, 0, 100); 88 EXPECT_NE(p, (void*)0); 89 memset(p, 0xde, 100); 90 void *p2 = user_realloc(thr, pc, p, 10000); 91 EXPECT_NE(p2, (void*)0); 92 for (int i = 0; i < 100; i++) 93 EXPECT_EQ(((char*)p2)[i], (char)0xde); 94 memset(p2, 0xde, 10000); 95 user_free(thr, pc, p2); 96 } 97 { 98 void *p = user_realloc(thr, pc, 0, 10000); 99 EXPECT_NE(p, (void*)0); 100 memset(p, 0xde, 10000); 101 void *p2 = user_realloc(thr, pc, p, 10); 102 EXPECT_NE(p2, (void*)0); 103 for (int i = 0; i < 10; i++) 104 EXPECT_EQ(((char*)p2)[i], (char)0xde); 105 user_free(thr, pc, p2); 106 } 107} 108 109} // namespace __tsan 110