Re: Undefined behavior detected by new clang's ubsan
John Naylor <johncnaylorls@gmail.com>
From: John Naylor <johncnaylorls@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Alexander Lakhin <exclusion@gmail.com>,
pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2026-02-02T11:30:13Z
Lists: pgsql-hackers
Attachments
- v2-0001-Fix-various-instances-of-undefined-behavior.patch (text/x-patch) patch v2-0001
- v2-0002-Future-proof-sort-template-against-undefined-beha.patch (text/x-patch) patch v2-0002
On Wed, Jan 21, 2026 at 5:05 PM John Naylor <johncnaylorls@gmail.com> wrote: > heaptoast.c > memcpy(VARDATA(result) + > - (curchunk * TOAST_MAX_CHUNK_SIZE - sliceoffset) + chcpystrt, > + (int)(curchunk * TOAST_MAX_CHUNK_SIZE - sliceoffset) + chcpystrt, Recall, the error was "runtime error: addition of unsigned offset to 0x7395fbd3d204 overflowed to 0x7395fbd3d142" It looks like "- 194" got turned into "+ (SIZE_MAX - 193)". Curiously, just removing the parentheses is enough to pass make check for me.: - (curchunk * TOAST_MAX_CHUNK_SIZE - sliceoffset) + chcpystrt, + curchunk * TOAST_MAX_CHUNK_SIZE - sliceoffset + chcpystrt, That's obviously equivalent in math, and IIUC in C precedence, so I'm not sure what to think of this. For v2 I've just done the above, but I'm curious if this raises anyone else's eyebrow. 0001 is backpatchable to v14, and doesn't change the sort template, and just guards NULL at the call site. The sort template change 0002 is a master-only patch. I don't think it would make any difference for performance, but to remove any doubt we could bump the insertion sort threshold, which is a good idea anyway. -- John Naylor Amazon Web Services
Commits
-
Future-proof sort template against undefined behavior
- 7467041cde9e 19 (unreleased) landed
-
Fix various instances of undefined behavior
- 176dffdf7d2a 19 (unreleased) landed
- fc56793c9ae5 14.21 landed
- b5e1cd2fdca1 18.2 landed
- 73ac2b37401d 16.12 landed
- 6b81a1c7c905 15.16 landed
- 1662cd0cb7ae 17.8 landed