2 * Copyright (c) 2020 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
11 #ifndef VPX_VPX_PORTS_COMPILER_ATTRIBUTES_H_
12 #define VPX_VPX_PORTS_COMPILER_ATTRIBUTES_H_
14 #if !defined(__has_feature)
15 #define __has_feature(x) 0
16 #endif // !defined(__has_feature)
18 #if !defined(__has_attribute)
19 #define __has_attribute(x) 0
20 #endif // !defined(__has_attribute)
22 //------------------------------------------------------------------------------
23 // Sanitizer attributes.
25 #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
26 #define VPX_WITH_ASAN 1
28 #define VPX_WITH_ASAN 0
29 #endif // __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
31 #if defined(__clang__) && __has_attribute(no_sanitize)
32 #define VPX_NO_UNSIGNED_OVERFLOW_CHECK \
33 __attribute__((no_sanitize("unsigned-integer-overflow")))
36 #ifndef VPX_NO_UNSIGNED_OVERFLOW_CHECK
37 #define VPX_NO_UNSIGNED_OVERFLOW_CHECK
40 //------------------------------------------------------------------------------
41 // Variable attributes.
43 #if __has_attribute(uninitialized)
44 // Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for
45 // the specified variable.
47 // -ftrivial-auto-var-init is security risk mitigation feature, so attribute
48 // should not be used "just in case", but only to fix real performance
49 // bottlenecks when other approaches do not work. In general the compiler is
50 // quite effective at eliminating unneeded initializations introduced by the
51 // flag, e.g. when they are followed by actual initialization by a program.
52 // However if compiler optimization fails and code refactoring is hard, the
53 // attribute can be used as a workaround.
54 #define VPX_UNINITIALIZED __attribute__((uninitialized))
56 #define VPX_UNINITIALIZED
57 #endif // __has_attribute(uninitialized)
59 #endif // VPX_VPX_PORTS_COMPILER_ATTRIBUTES_H_