brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 1cc3992 Raw
77 lines · c
1//===-- sanitizer_allocator_checks.h ----------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// Various checks shared between ThreadSanitizer, MemorySanitizer, etc. memory10// allocators.11//12//===----------------------------------------------------------------------===//13 14#ifndef SANITIZER_ALLOCATOR_CHECKS_H15#define SANITIZER_ALLOCATOR_CHECKS_H16 17#include "sanitizer_internal_defs.h"18#include "sanitizer_common.h"19#include "sanitizer_platform.h"20 21namespace __sanitizer {22 23// The following is defined in a separate compilation unit to avoid pulling in24// sanitizer_errno.h in this header, which leads to conflicts when other system25// headers include errno.h. This is usually the result of an unlikely event,26// and as such we do not care as much about having it inlined.27void SetErrnoToENOMEM();28 29// A common errno setting logic shared by almost all sanitizer allocator APIs.30inline void *SetErrnoOnNull(void *ptr) {31  if (UNLIKELY(!ptr))32    SetErrnoToENOMEM();33  return ptr;34}35 36// In case of the check failure, the caller of the following Check... functions37// should "return POLICY::OnBadRequest();" where POLICY is the current allocator38// failure handling policy.39 40// Checks aligned_alloc() parameters, verifies that the alignment is a power of41// two and that the size is a multiple of alignment for POSIX implementation,42// and a bit relaxed requirement for non-POSIX ones, that the size is a multiple43// of alignment.44inline bool CheckAlignedAllocAlignmentAndSize(uptr alignment, uptr size) {45#if SANITIZER_POSIX46  return alignment != 0 && IsPowerOfTwo(alignment) &&47         (size & (alignment - 1)) == 0;48#else49  return alignment != 0 && size % alignment == 0;50#endif51}52 53// Checks posix_memalign() parameters, verifies that alignment is a power of two54// and a multiple of sizeof(void *).55inline bool CheckPosixMemalignAlignment(uptr alignment) {56  return alignment != 0 && IsPowerOfTwo(alignment) &&57         (alignment % sizeof(void *)) == 0;58}59 60// Returns true if calloc(size, n) call overflows on size*n calculation.61inline bool CheckForCallocOverflow(uptr size, uptr n) {62  if (!size)63    return false;64  uptr max = (uptr)-1L;65  return (max / size) < n;66}67 68// Returns true if the size passed to pvalloc overflows when rounded to the next69// multiple of page_size.70inline bool CheckForPvallocOverflow(uptr size, uptr page_size) {71  return RoundUpTo(size, page_size) < size;72}73 74} // namespace __sanitizer75 76#endif  // SANITIZER_ALLOCATOR_CHECKS_H77