13cab2bb3Spatrick //===-- sanitizer_test_utils.h ----------------------------------*- C++ -*-===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file is a part of *Sanitizer runtime. 103cab2bb3Spatrick // Common unit tests utilities. 113cab2bb3Spatrick // 123cab2bb3Spatrick //===----------------------------------------------------------------------===// 133cab2bb3Spatrick 143cab2bb3Spatrick #ifndef SANITIZER_TEST_UTILS_H 153cab2bb3Spatrick #define SANITIZER_TEST_UTILS_H 163cab2bb3Spatrick 173cab2bb3Spatrick #if defined(_WIN32) 183cab2bb3Spatrick // <windows.h> should always be the first include on Windows. 193cab2bb3Spatrick # include <windows.h> 203cab2bb3Spatrick // MSVS headers define max/min as macros, so std::max/min gets crazy. 213cab2bb3Spatrick # undef max 223cab2bb3Spatrick # undef min 233cab2bb3Spatrick #endif 243cab2bb3Spatrick 253cab2bb3Spatrick #if !defined(SANITIZER_EXTERNAL_TEST_CONFIG) 263cab2bb3Spatrick # define INCLUDED_FROM_SANITIZER_TEST_UTILS_H 273cab2bb3Spatrick # include "sanitizer_test_config.h" 283cab2bb3Spatrick # undef INCLUDED_FROM_SANITIZER_TEST_UTILS_H 293cab2bb3Spatrick #endif 303cab2bb3Spatrick 313cab2bb3Spatrick #include <stdint.h> 323cab2bb3Spatrick 333cab2bb3Spatrick #if defined(_MSC_VER) 343cab2bb3Spatrick # define NOINLINE __declspec(noinline) 353cab2bb3Spatrick #else // defined(_MSC_VER) 363cab2bb3Spatrick # define NOINLINE __attribute__((noinline)) 373cab2bb3Spatrick #endif // defined(_MSC_VER) 383cab2bb3Spatrick 393cab2bb3Spatrick #if !defined(_MSC_VER) || defined(__clang__) 403cab2bb3Spatrick # define UNUSED __attribute__((unused)) 413cab2bb3Spatrick # define USED __attribute__((used)) 423cab2bb3Spatrick #else 433cab2bb3Spatrick # define UNUSED 443cab2bb3Spatrick # define USED 453cab2bb3Spatrick #endif 463cab2bb3Spatrick 473cab2bb3Spatrick #if !defined(__has_feature) 483cab2bb3Spatrick #define __has_feature(x) 0 493cab2bb3Spatrick #endif 503cab2bb3Spatrick 513cab2bb3Spatrick #ifndef ATTRIBUTE_NO_SANITIZE_ADDRESS 523cab2bb3Spatrick # if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 533cab2bb3Spatrick # define ATTRIBUTE_NO_SANITIZE_ADDRESS \ 543cab2bb3Spatrick __attribute__((no_sanitize_address)) 553cab2bb3Spatrick # else 563cab2bb3Spatrick # define ATTRIBUTE_NO_SANITIZE_ADDRESS 573cab2bb3Spatrick # endif 583cab2bb3Spatrick #endif // ATTRIBUTE_NO_SANITIZE_ADDRESS 593cab2bb3Spatrick 603cab2bb3Spatrick #if __LP64__ || defined(_WIN64) 613cab2bb3Spatrick # define SANITIZER_WORDSIZE 64 623cab2bb3Spatrick #else 633cab2bb3Spatrick # define SANITIZER_WORDSIZE 32 643cab2bb3Spatrick #endif 653cab2bb3Spatrick 663cab2bb3Spatrick // Make the compiler thinks that something is going on there. break_optimization(void * arg)673cab2bb3Spatrickinline void break_optimization(void *arg) { 683cab2bb3Spatrick #if !defined(_WIN32) || defined(__clang__) 693cab2bb3Spatrick __asm__ __volatile__("" : : "r" (arg) : "memory"); 703cab2bb3Spatrick #endif 713cab2bb3Spatrick } 723cab2bb3Spatrick 733cab2bb3Spatrick // This function returns its parameter but in such a way that compiler 743cab2bb3Spatrick // can not prove it. 753cab2bb3Spatrick template<class T> 763cab2bb3Spatrick NOINLINE Ident(T t)773cab2bb3Spatrickstatic T Ident(T t) { 783cab2bb3Spatrick T ret = t; 793cab2bb3Spatrick break_optimization(&ret); 803cab2bb3Spatrick return ret; 813cab2bb3Spatrick } 823cab2bb3Spatrick 833cab2bb3Spatrick // Simple stand-alone pseudorandom number generator. 843cab2bb3Spatrick // Current algorithm is ANSI C linear congruential PRNG. my_rand_r(uint32_t * state)853cab2bb3Spatrickstatic inline uint32_t my_rand_r(uint32_t* state) { 863cab2bb3Spatrick return (*state = *state * 1103515245 + 12345) >> 16; 873cab2bb3Spatrick } 883cab2bb3Spatrick 893cab2bb3Spatrick static uint32_t global_seed = 0; 903cab2bb3Spatrick my_rand()913cab2bb3Spatrickstatic inline uint32_t my_rand() { 923cab2bb3Spatrick return my_rand_r(&global_seed); 933cab2bb3Spatrick } 943cab2bb3Spatrick 953cab2bb3Spatrick // Set availability of platform-specific functions. 963cab2bb3Spatrick 973cab2bb3Spatrick #if !defined(__APPLE__) && !defined(__ANDROID__) && !defined(_WIN32) 983cab2bb3Spatrick # define SANITIZER_TEST_HAS_POSIX_MEMALIGN 1 993cab2bb3Spatrick #else 1003cab2bb3Spatrick # define SANITIZER_TEST_HAS_POSIX_MEMALIGN 0 1013cab2bb3Spatrick #endif 1023cab2bb3Spatrick 1033cab2bb3Spatrick #if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__ANDROID__) && \ 1043cab2bb3Spatrick !defined(__NetBSD__) && !defined(_WIN32) 1053cab2bb3Spatrick # define SANITIZER_TEST_HAS_MEMALIGN 1 1063cab2bb3Spatrick #else 1073cab2bb3Spatrick # define SANITIZER_TEST_HAS_MEMALIGN 0 1083cab2bb3Spatrick #endif 1093cab2bb3Spatrick 110*d89ec533Spatrick #if defined(__GLIBC__) 1113cab2bb3Spatrick # define SANITIZER_TEST_HAS_PVALLOC 1 1123cab2bb3Spatrick # define SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 1 1133cab2bb3Spatrick #else 1143cab2bb3Spatrick # define SANITIZER_TEST_HAS_PVALLOC 0 1153cab2bb3Spatrick # define SANITIZER_TEST_HAS_MALLOC_USABLE_SIZE 0 1163cab2bb3Spatrick #endif 1173cab2bb3Spatrick 1183cab2bb3Spatrick #if !defined(__APPLE__) 1193cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNLEN 1 1203cab2bb3Spatrick #else 1213cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNLEN 0 1223cab2bb3Spatrick #endif 1233cab2bb3Spatrick 1243cab2bb3Spatrick #if defined(__FreeBSD__) || defined(__NetBSD__) 1253cab2bb3Spatrick # define SANITIZER_TEST_HAS_PRINTF_L 1 1263cab2bb3Spatrick #else 1273cab2bb3Spatrick # define SANITIZER_TEST_HAS_PRINTF_L 0 1283cab2bb3Spatrick #endif 1293cab2bb3Spatrick 1303cab2bb3Spatrick #if !defined(_MSC_VER) 1313cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNDUP 1 1323cab2bb3Spatrick #else 1333cab2bb3Spatrick # define SANITIZER_TEST_HAS_STRNDUP 0 1343cab2bb3Spatrick #endif 1353cab2bb3Spatrick 1363cab2bb3Spatrick #endif // SANITIZER_TEST_UTILS_H 137