diff options
author | John Naylor <john.naylor@postgresql.org> | 2024-04-06 12:14:38 +0700 |
---|---|---|
committer | John Naylor <john.naylor@postgresql.org> | 2024-04-06 12:20:40 +0700 |
commit | db17594ad73a871a176a9bf96e0589c2cf57052c (patch) | |
tree | c7aea52bc45f0308819b436389557d0d6a07ccd7 /src | |
parent | 4b968e2027ba46b31be0a648486f86a2cadc707d (diff) | |
download | postgresql-db17594ad73a871a176a9bf96e0589c2cf57052c.tar.gz postgresql-db17594ad73a871a176a9bf96e0589c2cf57052c.zip |
Add macro to disable address safety instrumentation
fasthash_accum_cstring_aligned() uses a technique, found in various
strlen() implementations, to detect a string's NUL terminator by
reading a word at at time. That triggers failures when testing with
"-fsanitize=address", at least with frontend code. To enable using
this function anywhere, add a function attribute macro to disable
such testing.
Reviewed by Jeff Davis
Discussion: https://postgr.es/m/CANWCAZbwvp7oUEkbw-xP4L0_S_WNKq-J-ucP4RCNDPJnrakUPw%40mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r-- | src/include/c.h | 13 | ||||
-rw-r--r-- | src/include/common/hashfn_unstable.h | 5 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/include/c.h b/src/include/c.h index cf37e02fe1f..dc1841346cd 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -136,6 +136,19 @@ #endif /* + * This macro will disable address safety instrumentation for a function + * when running with "-fsanitize=address". Think twice before using this! + */ +#if defined(__clang__) || __GNUC__ >= 8 +#define pg_attribute_no_sanitize_address() __attribute__((no_sanitize("address"))) +#elif __has_attribute(no_sanitize_address) +/* This would work for clang, but it's deprecated. */ +#define pg_attribute_no_sanitize_address() __attribute__((no_sanitize_address)) +#else +#define pg_attribute_no_sanitize_address() +#endif + +/* * Place this macro before functions that should be allowed to make misaligned * accesses. Think twice before using it on non-x86-specific code! * Testing can be done with "-fsanitize=alignment -fsanitize-trap=alignment" diff --git a/src/include/common/hashfn_unstable.h b/src/include/common/hashfn_unstable.h index 1c782179cd6..d7ab6eeefe7 100644 --- a/src/include/common/hashfn_unstable.h +++ b/src/include/common/hashfn_unstable.h @@ -213,8 +213,11 @@ fasthash_accum_cstring_unaligned(fasthash_state *hs, const char *str) * * With an aligned pointer, we consume the string a word at a time. * Loading the word containing the NUL terminator cannot segfault since - * allocation boundaries are suitably aligned. + * allocation boundaries are suitably aligned. To keep from setting + * off alarms with address sanitizers, exclude this function from + * such testing. */ +pg_attribute_no_sanitize_address() static inline size_t fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str) { |