Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sun, 23 Nov 2014 11:37:19 -0500
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: [PATCH] Add stdatomic.h for clang>=3.1 and gcc>=4.1

On Sun, Nov 23, 2014 at 05:18:17PM +0100, Jens Gustedt wrote:
> > > > > > > What has all of this to do with VLA? I am lost.
> > > > > > 
> > > > > > The operands of __typeof__ and sizeof get evaluated when they have VLA
> > > > > > type. I think this is the problem.
> > > > > 
> > > > > ah, ok
> > > > > 
> > > > > No, this isn't a problem, I think. Arrays aren't allowed to be subject
> > > > > of an _Atomic qualification (arrays are never qualified
> > > > > themselves). For _Atomic type, the standard explicitly excludes
> > > > > arrays. So arrays in general and VLA in particular should never be
> > > > > passed as such into any of these generic functions, only pointers to
> > > > > atomic objects can.
> > > > 
> > > > Is a pointer to a variably modified type considered variably modified?
> > > 
> > > yes
> > > 
> > > > If so maybe these are affected too...
> > > 
> > > no, the pointers that can be passed to the atomic "functions" are
> > > always pointers to atomic objects, so they can't be arrays (and so
> > > VLA) themselves, nor can an atomic struct containt a VLA or a pointer
> > > to VLA.
> > 
> > _Atomic int (*pmat)[n];
> > 
> > Then &pmat is a pointer to a valid atomic type, an atomic pointer to a
> > VLA type.
> 
> I don't see that. Ain't that a pointer to a VLA of base type _Atomic
> int?
> 
> The beast that you describe would be
> 
> int (*_Atomic pmat)[n];

Yes, I messed it up. Sorry.

> and effectively this would be an atomic pointer to VM type. But
> concerning size, atomicity etc this is just a pointer type like any
> other. (The size information doesn't change, once it is initialized.)
> And concerning the atomic functions this is not different to
> 
> int (*_Atomic pmat)[];
> 
> Could you describe a bit more, where you think that there is a problem
> with such a thing?

But it's a variably-modified type, so sizeof and typeof evaluate the
expression when their operand is of this type. Thus, all you have to
do is make an array of objects of this type, and then refer to
arr[i++]. This will be an expression with variably-modified type, and
the evaluation will have unwanted side effects.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.