https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102937

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|FIXED                       |INVALID

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to David Rohr from comment #3)
> thanks, makes me feel pretty stupid...
> I thought it is not a problem since char* may alias, but apparently size_t*
> may not alias char**... if I understood correctly...

No, you are still misunderstand aliasing rules.

Basically you can access any type via a character type.
That is:
char *a = (char*)t;
a[n] = ...;
access *t

since you are doing basically:
char *a;
size_t *t = (size_t)&a;
*t = ....
access a

size_t only alias size_t and the signed version of what the type size_t was
typedef of (size_t is unsigned).
In the above case, you access "char*" as size_t which is undefined.  if you
instead accessed it as char rather than size_t then the code would be well
defined.
That is:
char *a;
char *b = (char*)&a;
b[0] = ...
b[1] = ...
b[2] = ...
....
access a

There are other ways fixing the issue by using memcpy (or an union but an union
in this case is harder to use correctly) than extra assignments.

Reply via email to