pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andres Freund <andres@anarazel.de>
Cc: pgsql-hackers@lists.postgresql.org, Robert Haas <robertmhaas@gmail.com>
Cc: Thomas Munro <thomas.munro@gmail.com>
Subject: Re: Pointer subtraction with a null pointer
Date: Sat, 26 Mar 2022 14:13:56 -0400
Message-ID: <103098.1648318436@sss.pgh.pa.us> (raw)
In-Reply-To: <20220326174953.gdeasrl5wzal42ic@alap3.anarazel.de>
References: <48826.1648310694@sss.pgh.pa.us>
	<49360.1648311192@sss.pgh.pa.us>
	<20220326163441.qzpcioycozbzarsf@alap3.anarazel.de>
	<51678.1648312664@sss.pgh.pa.us>
	<55128.1648315414@sss.pgh.pa.us>
	<20220326174953.gdeasrl5wzal42ic@alap3.anarazel.de>

Andres Freund <andres@anarazel.de> writes:
> Wonder if we should try to get rid of the problem by also fixing the double
> evaluation of val? I think something like

Good idea.  The attached also silences the warning, and getting rid
of the double-eval hazard seems like a net win.

> Might also be worth adding an assertion that base < val.

Did that too.  On the whole I like this better.

			regards, tom lane

Attachments:

  [text/x-diff] silence-null-subtraction-warning-2.patch (1.2K, ../103098.1648318436@sss.pgh.pa.us/2-silence-null-subtraction-warning-2.patch)
  download | inline diff:
diff --git a/src/include/utils/relptr.h b/src/include/utils/relptr.h
index fdc2124d2c..cc80a7200d 100644
--- a/src/include/utils/relptr.h
+++ b/src/include/utils/relptr.h
@@ -56,11 +56,24 @@
 #define relptr_is_null(rp) \
 	((rp).relptr_off == 0)
 
+/* We use this inline to avoid double eval of "val" in relptr_store */
+static inline Size
+relptr_store_eval(char *base, char *val)
+{
+	if (val == NULL)
+		return 0;
+	else
+	{
+		Assert(val > base);
+		return val - base;
+	}
+}
+
 #ifdef HAVE__BUILTIN_TYPES_COMPATIBLE_P
 #define relptr_store(base, rp, val) \
 	(AssertVariableIsOfTypeMacro(base, char *), \
 	 AssertVariableIsOfTypeMacro(val, __typeof__((rp).relptr_type)), \
-	 (rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base)))
+	 (rp).relptr_off = relptr_store_eval(base, (char *) (val)))
 #else
 /*
  * If we don't have __builtin_types_compatible_p, assume we might not have
@@ -68,7 +81,7 @@
  */
 #define relptr_store(base, rp, val) \
 	(AssertVariableIsOfTypeMacro(base, char *), \
-	 (rp).relptr_off = ((val) == NULL ? 0 : ((char *) (val)) - (base)))
+	 (rp).relptr_off = relptr_store_eval(base, (char *) (val)))
 #endif
 
 #define relptr_copy(rp1, rp2) \

view thread (14+ messages)  latest in thread

Message-ID: <103098.1648318436@sss.pgh.pa.us>
Permalink:  ../103098.1648318436@sss.pgh.pa.us/
Also on:    postgresql.org/message-id/103098.1648318436@sss.pgh.pa.us

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: tgl@sss.pgh.pa.us, andres@anarazel.de, robertmhaas@gmail.com, thomas.munro@gmail.com
  Subject: Re: Pointer subtraction with a null pointer
  In-Reply-To: <103098.1648318436@sss.pgh.pa.us>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox