Re: Solaris compiler status - Mailing list pgsql-hackers

From Peter Eisentraut
Subject Re: Solaris compiler status
Date
Msg-id 9001ee05-44e2-4f7e-97d9-85bb9efa84d4@eisentraut.org
Whole thread Raw
In response to Re: Solaris compiler status  (Daniel Gustafsson <daniel@yesql.se>)
List pgsql-hackers
On 03.09.25 13:42, Daniel Gustafsson wrote:
>> On 3 Sep 2025, at 07:47, Peter Eisentraut <peter@eisentraut.org> wrote:
> 
>> - Hundreds of compiler warnings (They are not necessarily wrong, but it shows that no one has taken care to tune the
warningsor the code in any way recently.)
 
> 
> Should these be posted somewhere before they are lost in case anyone is keen on
> digging through the list for any relevant fixes?

That would require me to figure out how to export files from this VM. 
;-)  But I did figure out how to copy and paste, so here is at least a 
summary:

    1 (E_ARG_INCOMPATIBLE_WITH_ARG_L)
   16 (E_ASSIGNMENT_TYPE_MISMATCH)
    1 (E_CONST_OBJ_SHOULD_HAVE_INITIZR)
   24 (E_CONST_PROMOTED_LONG_LONG)
    1 (E_EMPTY_DECLARATION)
1899 (E_END_OF_LOOP_CODE_NOT_REACHED)
   22 (E_FUNC_NO_RET_RET)
    2 (E_INTEGER_OVERFLOW_DETECTED)
   23 (E_L_OPERAND_DOT_NOT_LVALUE_NOW)
    2 (E_OPERANDS_INCOMPATIBLE_TYPES)
    1 (E_REF_STATIC_EXTERN_INLINE)
  714 (E_STATEMENT_NOT_REACHED)
  435 (E_STRUCT_DERIVED_FROM_FLEX_MBR)

Most of these as you can see are from lack of understanding about flow 
control annotations or conventions.

But there are a couple of interesting ones:

    1 (E_EMPTY_DECLARATION)

This is actually a real find, albeit harmless:

```
diff --git a/src/backend/replication/logical/slotsync.c 
b/src/backend/replication/logical/slotsync.c
index 9d0072a49ed..8c061d55bdb 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -1337,7 +1337,7 @@ reset_syncing_flag()
     SpinLockRelease(&SlotSyncCtx->mutex);

     syncing_slots = false;
-};
+}

  /*
   * The main loop of our worker process.
```

    2 (E_INTEGER_OVERFLOW_DETECTED)

This complains about lwlock.c

StaticAssertDecl((MAX_BACKENDS & LW_FLAG_MASK) == 0,
                  "MAX_BACKENDS and LW_FLAG_MASK overlap");

StaticAssertDecl((LW_VAL_EXCLUSIVE & LW_FLAG_MASK) == 0,
                  "LW_VAL_EXCLUSIVE and LW_FLAG_MASK overlap");

Here, MAX_BACKENDS is of type unsigned int and LW_FLAG_MASK is of type 
signed int.  (LW_VAL_EXCLUSIVE is computed from MAX_BACKENDS and is also 
unsigned int.)  The & operation promotes both to unsigned int, and so it 
thinks you might get an overflow of the LW_FLAG_MASK value?

I can make the warning go away with this:

diff --git a/src/backend/storage/lmgr/lwlock.c 
b/src/backend/storage/lmgr/lwlock.c
index a4aecd1fbc3..667ed4cf699 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -95,7 +95,7 @@
  #define LW_FLAG_RELEASE_OK         ((uint32) 1 << 30)
  #define LW_FLAG_LOCKED             ((uint32) 1 << 29)
  #define LW_FLAG_BITS               3
-#define LW_FLAG_MASK 
(((1<<LW_FLAG_BITS)-1)<<(32-LW_FLAG_BITS))
+#define LW_FLAG_MASK 
(((1U<<LW_FLAG_BITS)-1)<<(32-LW_FLAG_BITS))

  /* assumes MAX_BACKENDS is a (power of 2) - 1, checked below */
  #define LW_VAL_EXCLUSIVE           (MAX_BACKENDS + 1)

I can't reproduce this with gcc by removing -fwrapv and dialing up the 
-Wstrict-overflow= levels.  And I also don't want to think about what 
this double-shift expression even means. :-/

But intuitively, it seems better if a "mask" value has an unsigned type.

I don't know to what extent PostgreSQL can even survive in a non-fwrapv 
environment.  That's a larger philosophical question.




pgsql-hackers by date:

Previous
From: Andres Freund
Date:
Subject: Re: Should io_method=worker remain the default?
Next
From: Srirama Kucherlapati
Date:
Subject: RE: AIX support