Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l99jb-0006w4-Mu for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Feb 2021 16:49:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1l99ja-0006Ms-D0 for pgsql-hackers@arkaria.postgresql.org; Mon, 08 Feb 2021 16:49:58 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l99ja-0006Ml-5r for pgsql-hackers@lists.postgresql.org; Mon, 08 Feb 2021 16:49:58 +0000 Received: from sss.pgh.pa.us ([66.207.139.130]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l99jV-0004h0-VI; Mon, 08 Feb 2021 16:49:57 +0000 Received: from sss1.sss.pgh.pa.us (localhost [127.0.0.1]) by sss.pgh.pa.us (8.15.2/8.15.2) with ESMTP id 118Gnf0w628090; Mon, 8 Feb 2021 11:49:41 -0500 From: Tom Lane To: Alexander Korotkov cc: Heikki Linnakangas , Alexander Korotkov , pgsql-hackers@lists.postgresql.org Subject: Re: Detecting pointer misalignment (was Re: pgsql: Implementation of subscripting for jsonb) In-reply-to: <477102.1612747200@sss.pgh.pa.us> References: <37bb56a0-391d-759d-771b-9c1d8c15a84b@iki.fi> <3293925.1612163110@sss.pgh.pa.us> <475514.1612745257@sss.pgh.pa.us> <477102.1612747200@sss.pgh.pa.us> Comments: In-reply-to Tom Lane message dated "Sun, 07 Feb 2021 20:20:00 -0500" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <628042.1612802951.0@sss.pgh.pa.us> Date: Mon, 08 Feb 2021 11:49:41 -0500 Message-ID: <628089.1612802981@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <628042.1612802951.1@sss.pgh.pa.us> I wrote: > After digging in gcc's release history, it seems they invented > "-fsanitize=alignment" in GCC 5, so we can make this work for gcc > by writing > #if __GNUC__ >= 5 > (the likely() macro already uses a similar approach). Can't say > if that's close enough for clang too. Ugh, no it isn't: even pretty recent clang releases only define __GNUC__ as 4. It looks like we need a separate test on clang's version. I looked at their version history and sanitizers seem to have come in around clang 7, so I propose the attached (where I worked a bit harder on the comment, too). regards, tom lane ------- =_aaaaaaaaaa0 Content-Type: text/x-diff; name="pg_attribute_no_sanitize_alignment-2.patch"; charset="us-ascii" Content-ID: <628042.1612802951.2@sss.pgh.pa.us> Content-Description: pg_attribute_no_sanitize_alignment-2.patch Content-Transfer-Encoding: quoted-printable diff --git a/src/include/c.h b/src/include/c.h index ae978830da..a86342093e 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -132,6 +132,18 @@ #define pg_nodiscard #endif = +/* + * Place this macro before functions that should be allowed to make misal= igned + * accesses. Think twice before using it on non-x86-specific code! + * Testing can be done with "-fsanitize=3Dalignment -fsanitize-trap=3Dali= gnment" + * on clang, or "-fsanitize=3Dalignment -fno-sanitize-recover=3Dalignment= " on gcc. + */ +#if __clang_major__ >=3D 7 || __GNUC__ >=3D 5 +#define pg_attribute_no_sanitize_alignment() __attribute__((no_sanitize("= alignment"))) +#else +#define pg_attribute_no_sanitize_alignment() +#endif + /* * Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are o= nly * used in assert-enabled builds, to avoid compiler warnings about unused diff --git a/src/port/pg_crc32c_sse42.c b/src/port/pg_crc32c_sse42.c index 3b94a7388a..10fc01e1f0 100644 --- a/src/port/pg_crc32c_sse42.c +++ b/src/port/pg_crc32c_sse42.c @@ -18,6 +18,7 @@ = #include "port/pg_crc32c.h" = +pg_attribute_no_sanitize_alignment() pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len) { ------- =_aaaaaaaaaa0--