[HACKERS] ancient sequence point bug

2013-04-16 Thread Peter Eisentraut
This code in bootstrap.c contains a sequence point violation (or
whatever that is really called):

while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
{
(*app)-am_oid = HeapTupleGetOid(tup);
memmove((char *) (*app++)-am_typ,
(char *) GETSTRUCT(tup),
sizeof((*app)-am_typ));
}

In commit 1aebc361, another place in the same file was fixed like this:

@@ -445,13 +455,13 @@ struct typmap
while (HeapTupleIsValid(tup = heap_getnext(scan, 0)))
{
(*app)-am_oid = tup-t_data-t_oid;
-   memmove((char *) (*app++)-am_typ,
-   (char *) GETSTRUCT(tup),
-   sizeof((*app)-am_typ));
+   memcpy((char *) (*app)-am_typ,
+  (char *) GETSTRUCT(tup),
+  sizeof((*app)-am_typ));
+   app++;
}
heap_endscan(scan);
heap_close(rel, NoLock);

I think the same (move the app++, and change to memcpy (optionally))
should be done in the first case as well.



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] ancient sequence point bug

2013-04-16 Thread Tom Lane
Peter Eisentraut pete...@gmx.net writes:
 This code in bootstrap.c contains a sequence point violation (or
 whatever that is really called):

 while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
 {
 (*app)-am_oid = HeapTupleGetOid(tup);
 memmove((char *) (*app++)-am_typ,
 (char *) GETSTRUCT(tup),
 sizeof((*app)-am_typ));
 }

What exactly is the violation?  sizeof() is a side-effect-free compile
time constant, and the first value to be passed to memmove seems
perfectly well defined.

I grant that this is not terribly good coding style, but I don't believe
there's an actual risk here.

 In commit 1aebc361, another place in the same file was fixed like this:

Well, I don't really remember why I did that twelve years ago, but
seeing that there are a number of purely-cosmetic changes in that
commit, I'm thinking it was only meant to be cosmetic.

I certainly have no objection to making this code look more like that
code, I'm just not seeing that it's a bug.

regards, tom lane


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] ancient sequence point bug

2013-04-16 Thread Dann Corbit
-Original Message-
From: pgsql-hackers-ow...@postgresql.org 
[mailto:pgsql-hackers-ow...@postgresql.org] On Behalf Of Tom Lane
Sent: Tuesday, April 16, 2013 7:52 PM
To: Peter Eisentraut
Cc: pgsql-hackers@postgresql.org
Subject: Re: [HACKERS] ancient sequence point bug

Peter Eisentraut pete...@gmx.net writes:
 This code in bootstrap.c contains a sequence point violation (or 
 whatever that is really called):

 while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
 {
 (*app)-am_oid = HeapTupleGetOid(tup);
 memmove((char *) (*app++)-am_typ,
 (char *) GETSTRUCT(tup),
 sizeof((*app)-am_typ));
 }

What exactly is the violation?  sizeof() is a side-effect-free compile time 
constant, and the first value to be passed to memmove seems perfectly well 
defined.

Unless it is C99 and the object is a VLA, which must be evaluated at runtime.  
I guess that (*app)-am_typ is not a VLA, especially since PostgreSQL does not 
require C99 to compile.

I grant that this is not terribly good coding style, but I don't believe 
there's an actual risk here.

I agree that there is no risk in the sizeof operator.
According to my understanding, even this is legal:

unsigned long long *p = 0;
size_t stupid = sizeof (*p);
   printf(size of a long long is %u\n, (unsigned) stupid);

But I also guess that most compilers will have a cow when scanning it.

 In commit 1aebc361, another place in the same file was fixed like this:

Well, I don't really remember why I did that twelve years ago, but seeing that 
there are a number of purely-cosmetic changes in that commit, I'm thinking it 
was only meant to be cosmetic.

I certainly have no objection to making this code look more like that code, 
I'm just not seeing that it's a bug.

You are right. It's not a bug.  However, I would not be surprised if GCC or 
CLANG would shriek at the higher warning levels, usually not being able to 
apply artificial intelligence to solve problems that seem simple to humans.
In the interest of quiet compiles equivalent code that does not produce a 
warning seems like a good idea.  IMO-YMMV.

   regards, tom lane





-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers