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

--- Comment #12 from rguenther at suse dot de <rguenther at suse dot de> ---
On Thu, 14 Nov 2019, ch3root at openwall dot com wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92486
> 
> --- Comment #9 from Alexander Cherepanov <ch3root at openwall dot com> ---
> > Now as an exercise build a complete testcase for the DSE issue above.
> 
> Source code:
> 
> ----------------------------------------------------------------------
> #include <string.h>
> #include <stdio.h>
> 
> struct s {
>     char c;
>     int i;
> };
> 
> __attribute__((noinline,noclone))
> void f(struct s *p, struct s *q)
> {
>     struct s w;
> 
>     memset(&w, 0, sizeof(struct s));
>     w = *q;
> 
>     memset(p, 0, sizeof(struct s));
>     *p = w;
> }
> 
> int main()
> {
>     struct s x;
>     memset(&x, 1, sizeof(struct s));
> 
>     struct s y;
>     memset(&y, 2, sizeof(struct s));
> 
>     f(&y, &x);
> 
>     for (unsigned char *p = (unsigned char *)&y; p < (unsigned char *)&y +
> sizeof(struct s); p++)
>         printf("%d", *p);
>     printf("\n");
> }
> ----------------------------------------------------------------------
> 
> Results:
> 
> ----------------------------------------------------------------------
> $ gcc -std=c11 -pedantic -Wall -Wextra test.c && ./a.out
> 11111111
> $ gcc -std=c11 -pedantic -Wall -Wextra -O3 test.c && ./a.out
> 12221111
> ----------------------------------------------------------------------
> 
> gcc x86-64 version: gcc (GCC) 10.0.0 20191114 (experimental)
> 
> 
> But from the C standard POV this case is much more clear: there is no problem
> as stores into a struct make its padding unspecified (C11, 6.2.6.1p6). OTOH
> this sample demonstrates the problem with trunc, so it could be more 
> convenient
> for testing.

Yeah, I think the C standard is clear here but the question is about
GIMPLE IL semantics where making things "unspecified" is a bit awkward.

Reply via email to