Skip to content

Commit 2c5af52

Browse files
workaround asan problem
1 parent 3a4df5b commit 2c5af52

File tree

1 file changed

+35
-20
lines changed

1 file changed

+35
-20
lines changed

libc/test/src/sys/mman/linux/mincore_test.cpp

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,33 +29,46 @@ TEST(LlvmLibcMincoreTest, UnMappedMemory) {
2929
EXPECT_THAT(res, Fails(ENOMEM, -1));
3030
}
3131

32+
// It is always possible to find an aligned boundary if we allocate page sized
33+
// memory.
34+
static char *aligned_addr(void *addr, size_t alignment) {
35+
char *byte_addr = static_cast<char *>(addr);
36+
uintptr_t addr_val = reinterpret_cast<uintptr_t>(addr);
37+
uintptr_t offset =
38+
addr_val % alignment == 0 ? 0 : alignment - (addr_val % alignment);
39+
return byte_addr + offset;
40+
}
41+
3242
TEST(LlvmLibcMincoreTest, InvalidVec) {
3343
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
34-
void *addr = LIBC_NAMESPACE::mmap(nullptr, 4 * page_size, PROT_READ,
44+
void *addr = LIBC_NAMESPACE::mmap(nullptr, 5 * page_size, PROT_READ,
3545
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
3646
EXPECT_NE(addr, MAP_FAILED);
37-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % page_size, 0ul);
47+
// Since we allocated 5 pages, we can find an aligned boundary after which
48+
// there are at least 4 pages
49+
char *aligned = aligned_addr(addr, page_size);
3850
libc_errno = 0;
39-
int res = LIBC_NAMESPACE::mincore(addr, 1, nullptr);
51+
int res = LIBC_NAMESPACE::mincore(aligned, 1, nullptr);
4052
EXPECT_THAT(res, Fails(EFAULT, -1));
4153
void *area = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ | PROT_WRITE,
4254
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
4355
EXPECT_NE(area, MAP_FAILED);
4456
unsigned char *ptr = static_cast<unsigned char *>(area) + page_size - 3;
45-
res = LIBC_NAMESPACE::mincore(addr, 4 * page_size, ptr);
57+
res = LIBC_NAMESPACE::mincore(aligned, 4 * page_size, ptr);
4658
EXPECT_THAT(res, Fails(EFAULT, -1));
47-
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
48-
EXPECT_THAT(LIBC_NAMESPACE::munmap(area, 2), Succeeds());
59+
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, 5 * page_size), Succeeds());
60+
EXPECT_THAT(LIBC_NAMESPACE::munmap(area, page_size), Succeeds());
4961
}
5062

5163
TEST(LlvmLibcMincoreTest, UnalignedAddr) {
5264
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
5365
void *addr = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ,
5466
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
5567
EXPECT_NE(addr, MAP_FAILED);
56-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % page_size, 0ul);
68+
char *aligned = aligned_addr(addr, page_size);
5769
libc_errno = 0;
58-
int res = LIBC_NAMESPACE::mincore(static_cast<char *>(addr) + 1, 1, nullptr);
70+
int res =
71+
LIBC_NAMESPACE::mincore(static_cast<char *>(aligned) + 1, 1, nullptr);
5972
EXPECT_THAT(res, Fails(EINVAL, -1));
6073
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
6174
}
@@ -65,10 +78,10 @@ TEST(LlvmLibcMincoreTest, NoError) {
6578
void *addr = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ,
6679
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
6780
EXPECT_NE(addr, MAP_FAILED);
68-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % page_size, 0ul);
81+
char *aligned = aligned_addr(addr, page_size);
6982
unsigned char vec;
7083
libc_errno = 0;
71-
int res = LIBC_NAMESPACE::mincore(addr, 1, &vec);
84+
int res = LIBC_NAMESPACE::mincore(aligned, 1, &vec);
7285
EXPECT_THAT(res, Succeeds());
7386
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
7487
}
@@ -78,42 +91,44 @@ TEST(LlvmLibcMincoreTest, NegativeLength) {
7891
void *addr = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ,
7992
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
8093
EXPECT_NE(addr, MAP_FAILED);
81-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % page_size, 0ul);
94+
char *aligned = aligned_addr(addr, page_size);
8295
unsigned char vec;
8396
libc_errno = 0;
84-
int res = LIBC_NAMESPACE::mincore(addr, -1, &vec);
97+
int res = LIBC_NAMESPACE::mincore(aligned, -1, &vec);
8598
EXPECT_THAT(res, Fails(ENOMEM, -1));
8699
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
87100
}
88101

89102
TEST(LlvmLibcMincoreTest, PageOut) {
90103
unsigned char vec;
91104
size_t page_size = static_cast<size_t>(LIBC_NAMESPACE::sysconf(_SC_PAGESIZE));
92-
void *addr = LIBC_NAMESPACE::mmap(nullptr, page_size, PROT_READ | PROT_WRITE,
93-
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
105+
// allocate 2 pages since we need to page out page_size bytes
106+
void *addr =
107+
LIBC_NAMESPACE::mmap(nullptr, 2 * page_size, PROT_READ | PROT_WRITE,
108+
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
94109
EXPECT_NE(addr, MAP_FAILED);
95-
EXPECT_EQ(reinterpret_cast<unsigned long>(addr) % page_size, 0ul);
110+
char *aligned = aligned_addr(addr, page_size);
96111

97112
// touch the page
98113
{
99-
static_cast<char *>(addr)[0] = 0;
114+
aligned[0] = 0;
100115
libc_errno = 0;
101-
int res = LIBC_NAMESPACE::mincore(addr, 1, &vec);
116+
int res = LIBC_NAMESPACE::mincore(aligned, 1, &vec);
102117
EXPECT_EQ(vec & 1u, 1u);
103118
EXPECT_THAT(res, Succeeds());
104119
}
105120

106121
// page out the memory
107122
{
108123
libc_errno = 0;
109-
EXPECT_THAT(LIBC_NAMESPACE::madvise(addr, page_size, MADV_DONTNEED),
124+
EXPECT_THAT(LIBC_NAMESPACE::madvise(aligned, page_size, MADV_DONTNEED),
110125
Succeeds());
111126

112127
libc_errno = 0;
113-
int res = LIBC_NAMESPACE::mincore(addr, page_size, &vec);
128+
int res = LIBC_NAMESPACE::mincore(aligned, 1, &vec);
114129
EXPECT_EQ(vec & 1u, 0u);
115130
EXPECT_THAT(res, Succeeds());
116131
}
117132

118-
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());
133+
EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, 2 * page_size), Succeeds());
119134
}

0 commit comments

Comments
 (0)