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