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