OLD | NEW |
1 // Copyright 2013 Google Inc. All Rights Reserved. | 1 // Copyright 2013 Google Inc. All Rights Reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 13 matching lines...) Expand all Loading... |
24 namespace testing { | 24 namespace testing { |
25 | 25 |
26 // Disable the intrinsic versions of the intercepted functions. | 26 // Disable the intrinsic versions of the intercepted functions. |
27 #pragma function(memset, memcpy, strlen, strcmp) | 27 #pragma function(memset, memcpy, strlen, strcmp) |
28 | 28 |
29 // Helper function to make sure that a memory read access doesn't get | 29 // Helper function to make sure that a memory read access doesn't get |
30 // instrumented. | 30 // instrumented. |
31 // @tparam type The type of the value to be read. | 31 // @tparam type The type of the value to be read. |
32 // @param location The location where to read from. | 32 // @param location The location where to read from. |
33 // @returns the value at |location| | 33 // @returns the value at |location| |
34 template<typename type> | 34 template <typename type> |
| 35 #if defined(__clang__) |
| 36 type __attribute__((no_sanitize_address)) NonInterceptedRead(type* location) { |
| 37 return *location; |
| 38 } |
| 39 #else |
35 type NonInterceptedRead(type* location) { | 40 type NonInterceptedRead(type* location) { |
36 // The try-except statement prevents the function from being instrumented. | 41 // The try-except statement prevents the function from being instrumented. |
37 __try { | 42 __try { |
38 return *location; | 43 return *location; |
39 } __except(EXCEPTION_CONTINUE_SEARCH) { | 44 } __except(EXCEPTION_CONTINUE_SEARCH) { |
40 // Nothing to do here. | 45 // Nothing to do here. |
41 } | 46 } |
42 return static_cast<type>(0); | 47 return static_cast<type>(0); |
43 } | 48 } |
| 49 #endif |
44 | 50 |
45 // Helper function to do non instrumented reads from an array. | 51 // Helper function to do non instrumented reads from an array. |
46 // @tparam type The type of the values to be read. | 52 // @tparam type The type of the values to be read. |
47 // @param src The array where to read from. | 53 // @param src The array where to read from. |
48 // @param size The size of the array. | 54 // @param size The size of the array. |
49 // @param dst The destination array. | 55 // @param dst The destination array. |
50 template<typename type> | 56 template<typename type> |
51 void NonInterceptedReads(type* src, size_t size, type* dst) { | 57 void NonInterceptedReads(type* src, size_t size, type* dst) { |
52 for (size_t i = 0; i < size; ++i) | 58 for (size_t i = 0; i < size; ++i) |
53 *dst++ = NonInterceptedRead(src + i); | 59 *dst++ = NonInterceptedRead(src + i); |
54 } | 60 } |
55 | 61 |
56 // Helper function to make sure that a memory write access didn't get | 62 // Helper function to make sure that a memory write access didn't get |
57 // instrumented. | 63 // instrumented. |
58 // @tparam type The type of the value to be written. | 64 // @tparam type The type of the value to be written. |
59 // @param location The location where to write to. | 65 // @param location The location where to write to. |
60 // @param val The value to write. | 66 // @param val The value to write. |
61 template<typename type> | 67 template <typename type> |
| 68 #if defined(__clang__) |
| 69 void __attribute__((no_sanitize_address)) |
| 70 NonInterceptedWrite(type* location, type val) { |
| 71 *location = val; |
| 72 } |
| 73 #else |
62 void NonInterceptedWrite(type* location, type val) { | 74 void NonInterceptedWrite(type* location, type val) { |
63 // The try-except statement prevents the function from being instrumented. | 75 // The try-except statement prevents the function from being instrumented. |
64 __try { | 76 __try { |
65 *location = val; | 77 *location = val; |
66 } __except(EXCEPTION_CONTINUE_SEARCH) { | 78 } __except(EXCEPTION_CONTINUE_SEARCH) { |
67 // Nothing to do here. | 79 // Nothing to do here. |
68 } | 80 } |
69 } | 81 } |
| 82 #endif |
70 | 83 |
71 // Helper function to do non instrumented writes from an array. | 84 // Helper function to do non instrumented writes from an array. |
72 // @tparam type The type of the values to be written. | 85 // @tparam type The type of the values to be written. |
73 // @param src The array where to read from. | 86 // @param src The array where to read from. |
74 // @param size The size of the array. | 87 // @param size The size of the array. |
75 // @param dst The address where to write to. | 88 // @param dst The address where to write to. |
76 template<typename type> | 89 template<typename type> |
77 void NonInterceptedWrites(type* src, size_t size, type* dst) { | 90 void NonInterceptedWrites(type* src, size_t size, type* dst) { |
78 for (size_t i = 0; i < size; ++i) | 91 for (size_t i = 0; i < size; ++i) |
79 NonInterceptedWrite(dst++, src[i]); | 92 NonInterceptedWrite(dst++, src[i]); |
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 // "uninstrumented" tests will cause an access violation exception to be thrown. | 473 // "uninstrumented" tests will cause an access violation exception to be thrown. |
461 size_t AsanNearNullptrAccessHeapCorruptionInstrumented(); | 474 size_t AsanNearNullptrAccessHeapCorruptionInstrumented(); |
462 size_t AsanNearNullptrAccessHeapCorruptionUninstrumented(); | 475 size_t AsanNearNullptrAccessHeapCorruptionUninstrumented(); |
463 size_t AsanNearNullptrAccessNoHeapCorruptionInstrumented(); | 476 size_t AsanNearNullptrAccessNoHeapCorruptionInstrumented(); |
464 size_t AsanNearNullptrAccessNoHeapCorruptionUninstrumented(); | 477 size_t AsanNearNullptrAccessNoHeapCorruptionUninstrumented(); |
465 size_t AsanNullptrAccessNoHeapCorruptionUninstrumented(); | 478 size_t AsanNullptrAccessNoHeapCorruptionUninstrumented(); |
466 | 479 |
467 } // namespace testing | 480 } // namespace testing |
468 | 481 |
469 #endif // SYZYGY_INTEGRATION_TESTS_ASAN_INTERCEPTORS_TESTS_H_ | 482 #endif // SYZYGY_INTEGRATION_TESTS_ASAN_INTERCEPTORS_TESTS_H_ |
OLD | NEW |