sanitizer_test_utils.h revision f7f2e431263cc0aa321218ce8978b289187a39a3
1//===-- sanitizer_test_utils.h ----------------------------------*- C++ -*-===// 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 *Sanitizer runtime. 11// Common unit tests utilities. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef SANITIZER_TEST_UTILS_H 16#define SANITIZER_TEST_UTILS_H 17 18#if defined(_WIN32) 19typedef unsigned __int8 uint8_t; 20typedef unsigned __int16 uint16_t; 21typedef unsigned __int32 uint32_t; 22typedef unsigned __int64 uint64_t; 23typedef __int8 int8_t; 24typedef __int16 int16_t; 25typedef __int32 int32_t; 26typedef __int64 int64_t; 27# define NOINLINE __declspec(noinline) 28# define USED 29#else // defined(_WIN32) 30# define NOINLINE __attribute__((noinline)) 31# define USED __attribute__((used)) 32#include <stdint.h> 33#endif // defined(_WIN32) 34 35#if !defined(__has_feature) 36#define __has_feature(x) 0 37#endif 38 39#ifndef ATTRIBUTE_NO_SANITIZE_ADDRESS 40# if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 41# define ATTRIBUTE_NO_SANITIZE_ADDRESS \ 42 __attribute__((no_sanitize_address)) 43# else 44# define ATTRIBUTE_NO_SANITIZE_ADDRESS 45# endif 46#endif // ATTRIBUTE_NO_SANITIZE_ADDRESS 47 48#if __LP64__ || defined(_WIN64) 49# define SANITIZER_WORDSIZE 64 50#else 51# define SANITIZER_WORDSIZE 32 52#endif 53 54// Make the compiler thinks that something is going on there. 55inline void break_optimization(void *arg) { 56 __asm__ __volatile__("" : : "r" (arg) : "memory"); 57} 58 59// This function returns its parameter but in such a way that compiler 60// can not prove it. 61template<class T> 62NOINLINE 63static T Ident(T t) { 64 T ret = t; 65 break_optimization(&ret); 66 return ret; 67} 68 69// Simple stand-alone pseudorandom number generator. 70// Current algorithm is ANSI C linear congruential PRNG. 71static inline uint32_t my_rand_r(uint32_t* state) { 72 return (*state = *state * 1103515245 + 12345) >> 16; 73} 74 75static uint32_t global_seed = 0; 76 77static inline uint32_t my_rand() { 78 return my_rand_r(&global_seed); 79} 80 81 82#endif // SANITIZER_TEST_UTILS_H 83