asan_test_utils.h revision badab16503e025326a46a45da8faa6fd20e5fc3d
1f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek//===-- asan_test_utils.h ---------------------------------------*- C++ -*-===// 2f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// 3f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// The LLVM Compiler Infrastructure 4f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// 5f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// This file is distributed under the University of Illinois Open Source 6f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// License. See LICENSE.TXT for details. 7f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// 8f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek//===----------------------------------------------------------------------===// 9f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// 10f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// This file is a part of AddressSanitizer, an address sanity checker. 11f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek// 12f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek//===----------------------------------------------------------------------===// 13f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek 14d95e0b830ed031f2ea0e15e3679cd51b9bf23a9cAnna Zaks#ifndef ASAN_TEST_UTILS_H 15d95e0b830ed031f2ea0e15e3679cd51b9bf23a9cAnna Zaks#define ASAN_TEST_UTILS_H 16e6348c336fecc8da9288ea367375a1b1cd2358d2Argyrios Kyrtzidis 17f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#if !defined(ASAN_EXTERNAL_TEST_CONFIG) 18f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# define INCLUDED_FROM_ASAN_TEST_UTILS_H 19802be99a6817aba6edb166b93c133da4358aa783Zhongxing Xu# include "asan_test_config.h" 20f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# undef INCLUDED_FROM_ASAN_TEST_UTILS_H 21efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar#endif 22aa5609891df937291bf962dd2fc7deb2ceae292fAnna Zaks 23efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar#if defined(_WIN32) 24d95e0b830ed031f2ea0e15e3679cd51b9bf23a9cAnna Zakstypedef unsigned __int8 uint8_t; 25371b477836f289f2e9caaab58530f187b51bc86dTed Kremenektypedef unsigned __int16 uint16_t; 2627af04bcca46f8a3374586be1301477f9123f5e1Argyrios Kyrtzidistypedef unsigned __int32 uint32_t; 2743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidistypedef unsigned __int64 uint64_t; 2821142581d55918beed544a757e4af3bb865b1812Ted Kremenektypedef __int8 int8_t; 299b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenektypedef __int16 int16_t; 309b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenektypedef __int32 int32_t; 319b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenektypedef __int64 int64_t; 329b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek# define NOINLINE __declspec(noinline) 33f39d962cf84f46d2c0512157259ae1d41a1a5173David Blaikie# define USED 34a7af5ea88a6c5bdf87497cca6c20831e8c546751Argyrios Kyrtzidis#else // defined(_WIN32) 35efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar# define NOINLINE __attribute__((noinline)) 36efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar# define USED __attribute__((used)) 37987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#endif // defined(_WIN32) 38efceabd2380f49306bc0229583458e93b062094bDaniel Dunbar 39f8ce6991f41d55b6e8526b7a7919771428e2b181Ted Kremenek#if !defined(__has_feature) 4003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#define __has_feature(x) 0 4103013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#endif 42d38f79543136ba68cd14b1dab0856474df1fbfd5Anna Zaks 43d95e0b830ed031f2ea0e15e3679cd51b9bf23a9cAnna Zaks#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) 446cb7c1a43b0c8f739d1f54b7fdae5ede86033496Benjamin Kramer# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \ 456a86082f3a06a2dcceaaf63f78a0e52d64bcbaa3Anna Zaks __attribute__((no_address_safety_analysis)) 4681fb169f42769e02c7425b23885a261c025fd5e6Anna Zaks#else 47db09a4dee28a4515438af60f2d2b4a83e4965c31Ted Kremenek# define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS 487fe8dcef71ae56e43fd7df345db2895f84f2d0caAnna Zaks#endif 497fe8dcef71ae56e43fd7df345db2895f84f2d0caAnna Zaks 50f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek#if __LP64__ || defined(_WIN64) 519ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek# define SANITIZER_WORDSIZE 64 52d95e0b830ed031f2ea0e15e3679cd51b9bf23a9cAnna Zaks#else 53f4381fddf152a63e1ac97185293c47ec0ac2f1a6Ted Kremenek# define SANITIZER_WORDSIZE 32 54c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu#endif 55ff944a8c481d6c0f1ad2633e4be9bf8b1dd2a09fZhongxing Xu 563fd5f370a28552976c52e76c3035d79012d78ddaAnna Zaks// Make the compiler thinks that something is going on there. 57d95e0b830ed031f2ea0e15e3679cd51b9bf23a9cAnna Zaksinline void break_optimization(void *arg) { 58e62f048960645b79363408fdead53fec2a063c52Anna Zaks __asm__ __volatile__ ("" : : "r" (arg) : "memory"); 59e62f048960645b79363408fdead53fec2a063c52Anna Zaks} 60e62f048960645b79363408fdead53fec2a063c52Anna Zaks 6184c1f4b1edddf74f8080cfc470796c2c498b5d43Anna Zaks// This function returns its parameter but in such a way that compiler 62d95e0b830ed031f2ea0e15e3679cd51b9bf23a9cAnna Zaks// can not prove it. 63be1fe1eb12a1cb91c8e3a9fcc2db4dfe989def6cTed Kremenektemplate<class T> 64f39d962cf84f46d2c0512157259ae1d41a1a5173David BlaikieNOINLINE 65f75560670bcdd59b051149bdece3eac14e313853Ted Kremenekstatic T Ident(T t) { 66f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek T ret = t; 67c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek break_optimization(&ret); 68c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek return ret; 69c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek} 70c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek 71c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek#endif // ASAN_TEST_UTILS_H 72f75560670bcdd59b051149bdece3eac14e313853Ted Kremenek