brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 7f3a38e Raw
66 lines · c
1// RUN: %clang_scudo %s -o %t2// RUN:                                                 %run %t valid   2>&13// RUN:                                             not %run %t invalid 2>&1 | FileCheck %s4// RUN: %env_scudo_opts=allocator_may_return_null=1     %run %t invalid 2>&15// UNSUPPORTED: android6 7// Tests that valloc and pvalloc work as intended.8 9#include <assert.h>10#include <errno.h>11#include <malloc.h>12#include <stdint.h>13#include <string.h>14#include <unistd.h>15 16size_t round_up_to(size_t size, size_t alignment) {17  return (size + alignment - 1) & ~(alignment - 1);18}19 20int main(int argc, char **argv) {21  void *p = NULL;22  size_t size, page_size;23 24  assert(argc == 2);25 26  page_size = sysconf(_SC_PAGESIZE);27  // Check that the page size is a power of two.28  assert((page_size & (page_size - 1)) == 0);29 30  if (!strcmp(argv[1], "valid")) {31    for (int i = (sizeof(void *) == 4) ? 3 : 4; i < 21; i++) {32      size = 1U << i;33      p = valloc(size - (2 * sizeof(void *)));34      assert(p);35      assert(((uintptr_t)p & (page_size - 1)) == 0);36      free(p);37      p = pvalloc(size - (2 * sizeof(void *)));38      assert(p);39      assert(((uintptr_t)p & (page_size - 1)) == 0);40      assert(malloc_usable_size(p) >= round_up_to(size, page_size));41      free(p);42      p = valloc(size);43      assert(p);44      assert(((uintptr_t)p & (page_size - 1)) == 0);45      free(p);46      p = pvalloc(size);47      assert(p);48      assert(((uintptr_t)p & (page_size - 1)) == 0);49      assert(malloc_usable_size(p) >= round_up_to(size, page_size));50      free(p);51    }52  }53  if (!strcmp(argv[1], "invalid")) {54    // Size passed to pvalloc overflows when rounded up.55    p = pvalloc((size_t)-1);56    // CHECK: Scudo ERROR: pvalloc parameters overflow57    assert(!p);58    assert(errno == ENOMEM);59    errno = 0;60    p = pvalloc((size_t)-page_size);61    assert(!p);62    assert(errno == ENOMEM);63  }64  return 0;65}66