warning: dereferencing type-punned pointer - Mailing list pgsql-hackers

From Tatsuo Ishii
Subject warning: dereferencing type-punned pointer
Date
Msg-id 20240724.155525.366150353176322967.ishii@postgresql.org
Whole thread Raw
Responses Re: warning: dereferencing type-punned pointer
Re: warning: dereferencing type-punned pointer
List pgsql-hackers
Today I compiled PostgreSQL master branch with -fno-strict-aliasing
compile option removed (previous discussions on the $subject [1]). gcc
version is 9.4.0.

There are a few places where $subject warning printed.

In file included from ../../../src/include/nodes/pg_list.h:42,
                 from ../../../src/include/access/tupdesc.h:19,
                 from ../../../src/include/access/htup_details.h:19,
                 from ../../../src/include/access/heaptoast.h:16,
                 from execExprInterp.c:59:
execExprInterp.c: In function ‘ExecEvalJsonExprPath’:
../../../src/include/nodes/nodes.h:133:29: warning: dereferencing type-punned pointer will break strict-aliasing rules
[-Wstrict-aliasing]
  133 | #define nodeTag(nodeptr)  (((const Node*)(nodeptr))->type)
      |                            ~^~~~~~~~~~~~~~~~~~~~~~~
../../../src/include/nodes/nodes.h:158:31: note: in expansion of macro ‘nodeTag’
  158 | #define IsA(nodeptr,_type_)  (nodeTag(nodeptr) == T_##_type_)
      |                               ^~~~~~~
../../../src/include/nodes/miscnodes.h:53:26: note: in expansion of macro ‘IsA’
   53 |  ((escontext) != NULL && IsA(escontext, ErrorSaveContext) && \
      |                          ^~~
execExprInterp.c:4399:7: note: in expansion of macro ‘SOFT_ERROR_OCCURRED’
 4399 |   if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
      |       ^~~~~~~~~~~~~~~~~~~
execExprInterp.c: In function ‘ExecEvalJsonCoercionFinish’:
../../../src/include/nodes/nodes.h:133:29: warning: dereferencing type-punned pointer will break strict-aliasing rules
[-Wstrict-aliasing]
  133 | #define nodeTag(nodeptr)  (((const Node*)(nodeptr))->type)
      |                            ~^~~~~~~~~~~~~~~~~~~~~~~
../../../src/include/nodes/nodes.h:158:31: note: in expansion of macro ‘nodeTag’
  158 | #define IsA(nodeptr,_type_)  (nodeTag(nodeptr) == T_##_type_)
      |                               ^~~~~~~
../../../src/include/nodes/miscnodes.h:53:26: note: in expansion of macro ‘IsA’
   53 |  ((escontext) != NULL && IsA(escontext, ErrorSaveContext) && \
      |                          ^~~
execExprInterp.c:4556:6: note: in expansion of macro ‘SOFT_ERROR_OCCURRED’
 4556 |  if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
      |      ^~~~~~~~~~~~~~~~~~~
origin.c: In function ‘StartupReplicationOrigin’:
origin.c:773:16: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
  773 |    file_crc = *(pg_crc32c *) &disk_state;
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~

In my understanding from the discussion [1], it would be better to fix
our code to avoid the warning because it *might* point out that there
is something wrong with our code. However the consensus at the time
was, we will not remove -fno-strict-aliasing option for now. It will
take long time before it would happen...

So I think the warnings in ExecEvalJsonExprPath are better fixed
because these are the only places where IsA (nodeTag) macro are used
and the warning is printed. Patch attached.

I am not so sure about StartupReplicationOrigin. Should we fix it now?
For me the code looks sane as long as we keep -fno-strict-aliasing
option. Or maybe better to fix so that someday we could remove the
compiler option?

[1] https://www.postgresql.org/message-id/flat/366.1535731324%40sss.pgh.pa.us#bd93089182d13c79b74593ec70bac435

Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index d8735286c4..387311fdfb 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -4381,6 +4381,7 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op,
     if (!*op->resnull && jsexpr->use_io_coercion)
     {
         FunctionCallInfo fcinfo;
+        Node       *node;
 
         Assert(jump_eval_coercion == -1);
         fcinfo = jsestate->input_fcinfo;
@@ -4396,7 +4397,8 @@ ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op,
 
         fcinfo->isnull = false;
         *op->resvalue = FunctionCallInvoke(fcinfo);
-        if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
+        node = (Node *) &jsestate->escontext;
+        if (SOFT_ERROR_OCCURRED(node))
             error = true;
     }
 
@@ -4552,8 +4554,9 @@ void
 ExecEvalJsonCoercionFinish(ExprState *state, ExprEvalStep *op)
 {
     JsonExprState *jsestate = op->d.jsonexpr.jsestate;
+    Node       *node = (Node *) &jsestate->escontext;
 
-    if (SOFT_ERROR_OCCURRED(&jsestate->escontext))
+    if (SOFT_ERROR_OCCURRED(node))
     {
         *op->resvalue = (Datum) 0;
         *op->resnull = true;

pgsql-hackers by date:

Previous
From: "Hayato Kuroda (Fujitsu)"
Date:
Subject: Found issues related with logical replication and 2PC
Next
From: Ashutosh Bapat
Date:
Subject: Re: Reuse child_relids in try_partitionwise_join was Re: Assert failure on bms_equal(child_joinrel->relids, child_joinrelids)