Re: pg_verify_checksums and -fno-strict-aliasing

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Michael Banck <michael.banck@credativ.de>, Magnus Hagander <magnus@hagander.net>, Fabien COELHO <coelho@cri.ensmp.fr>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2018-08-30T22:04:09Z
Lists: pgsql-hackers

Attachments

On 2018-08-30 14:46:06 -0700, Andres Freund wrote:
> Hi,
> 
> On 2018-08-30 17:19:28 -0400, Tom Lane wrote:
> > So, I've been fooling around trying to get it to work without
> > -fno-strict-aliasing, but with little luck so far.
> 
> The problem presumably is that pg_checksum_block() accesses the relevant
> fields as an uint32, whereas pg_checksum_page() accesses it as a
> PageHeader. That's an aliasing violation.  *One* cast from char* to
> either type is fine, it's accessing under both those types that's
> problematic.
> 
> One way to fix it would be to memcpy in/out the modified PageHeader, or
> just do offset math and memcpy to that offset.

It took me a bit to reproduce the issue (due to sheer stupidity on my
part: no, changing the flags passed to gcc to link pg_verify_checksums
doesn't do the trick), but the above indeed fixes the issue for me.

The attached is just for demonstration that the approach works.

Greetings,

Andres Freund

Commits

  1. Avoid using potentially-under-aligned page buffers.

  2. Code review for pg_verify_checksums.c.

  3. Make checksum_impl.h safe to compile with -fstrict-aliasing.