asan_test_utils.h revision 2697687059e64a4f1319dc23a0a3ca59982d53f6
17da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov//===-- asan_test_utils.h ---------------------------------------*- C++ -*-===// 21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// The LLVM Compiler Infrastructure 41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source 61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details. 71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker. 111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#ifndef ASAN_TEST_UTILS_H 151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#define ASAN_TEST_UTILS_H 161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 177da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov#if !defined(ASAN_EXTERNAL_TEST_CONFIG) 187da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov# define INCLUDED_FROM_ASAN_TEST_UTILS_H 197da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov# include "asan_test_config.h" 207da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov# undef INCLUDED_FROM_ASAN_TEST_UTILS_H 217da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov#endif 227da8503a90c7f84787aa1ba978e2223893fa7727Alexey Samsonov 23938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#if defined(_WIN32) 24938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int8 uint8_t; 25938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int16 uint16_t; 26938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int32 uint32_t; 27938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef unsigned __int64 uint64_t; 28938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int8 int8_t; 29938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int16 int16_t; 30938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int32 int32_t; 31938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanovtypedef __int64 int64_t; 32938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov# define NOINLINE __declspec(noinline) 33fa7e95da75c30b7111224e68cb4405357bdc0f4bAlexey Samsonov# define USED 34938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#else // defined(_WIN32) 35938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov# define NOINLINE __attribute__((noinline)) 36fa7e95da75c30b7111224e68cb4405357bdc0f4bAlexey Samsonov# define USED __attribute__((used)) 37938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#endif // defined(_WIN32) 38938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov 39938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#if !defined(__has_feature) 40938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#define __has_feature(x) 0 41938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#endif 42938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov 43badab16503e025326a46a45da8faa6fd20e5fc3dKostya Serebryany#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 441cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \ 451cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov __attribute__((no_address_safety_analysis)) 461cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov#else 471cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS 481cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov#endif 491cffef3e39cad4eb33606afbebac78d6637361acAlexey Samsonov 50938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#if __LP64__ || defined(_WIN64) 515af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany# define SANITIZER_WORDSIZE 64 52938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#else 535af39e50366f1aacbebc284f572f08ad1ad07357Kostya Serebryany# define SANITIZER_WORDSIZE 32 54938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov#endif 55938106753364d96cedc11cbdc35a15030fb44d0cTimur Iskhodzhanov 564cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryany// Make the compiler thinks that something is going on there. 574cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryanyinline void break_optimization(void *arg) { 584cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryany __asm__ __volatile__ ("" : : "r" (arg) : "memory"); 594cf06575e772d64907d4dc7d49f2ecc7830137f6Kostya Serebryany} 601e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This function returns its parameter but in such a way that compiler 621e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// can not prove it. 631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanytemplate<class T> 64938106753364d96cedc11cbdc35a15030fb44d0cTimur IskhodzhanovNOINLINE 651e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic T Ident(T t) { 661e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany T ret = t; 671e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany break_optimization(&ret); 681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return ret; 691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 712697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany// Check that pthread_create/pthread_join return success. 722697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany#define PTHREAD_CREATE(a, b, c, d) EXPECT_EQ(0, pthread_create(a, b, c, d)) 732697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany#define PTHREAD_JOIN(a, b) EXPECT_EQ(0, pthread_join(a, b)) 742697687059e64a4f1319dc23a0a3ca59982d53f6Kostya Serebryany 751e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#endif // ASAN_TEST_UTILS_H 76