Skip to content

Commit c86eae3

Browse files
committed
pg_attribute_no_sanitize_alignment() macro
Modern gcc and clang compilers offer alignment sanitizers, which help to detect pointer misalignment. However, our codebase already contains x86-specific crc32 computation code, which uses unalignment access. Thankfully, those compilers also support the attribute, which disables alignment sanitizers at the function level. This commit adds pg_attribute_no_sanitize_alignment(), which wraps this attribute, and applies it to pg_comp_crc32c_sse42() function. Back-patch of commits 993bdb9f9 and ad2ad698a, to enable doing alignment testing in all supported branches. Discussion: https://postgr.es/m/CAPpHfdsne3%3DT%3DfMNU45PtxdhSL_J2PjLTeS8rwKnJzUR4YNd4w%40mail.gmail.com Discussion: https://postgr.es/m/475514.1612745257%40sss.pgh.pa.us Author: Alexander Korotkov, revised by Tom Lane Reviewed-by: Tom Lane
1 parent bcd5e95 commit c86eae3

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

src/include/c.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,18 @@
110110
#define pg_attribute_unused()
111111
#endif
112112

113+
/*
114+
* Place this macro before functions that should be allowed to make misaligned
115+
* accesses. Think twice before using it on non-x86-specific code!
116+
* Testing can be done with "-fsanitize=alignment -fsanitize-trap=alignment"
117+
* on clang, or "-fsanitize=alignment -fno-sanitize-recover=alignment" on gcc.
118+
*/
119+
#if __clang_major__ >= 7 || __GNUC__ >= 8
120+
#define pg_attribute_no_sanitize_alignment() __attribute__((no_sanitize("alignment")))
121+
#else
122+
#define pg_attribute_no_sanitize_alignment()
123+
#endif
124+
113125
/*
114126
* Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are only
115127
* used in assert-enabled builds, to avoid compiler warnings about unused

src/port/pg_crc32c_sse42.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "port/pg_crc32c.h"
2020

21+
pg_attribute_no_sanitize_alignment()
2122
pg_crc32c
2223
pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len)
2324
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy