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

--- Comment #31 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
For the testcase in comment #0 we do warn:
<source>: In function 'void foo()':
<source>:7:47: warning: iteration 3 invokes undefined behavior
[-Waggressive-loop-optimizations]
    7 |   for (i=0, accum=a[0]; i < N; i++, accum+=a[i])
      |                                            ~~~^
<source>:7:27: note: within this loop
    7 |   for (i=0, accum=a[0]; i < N; i++, accum+=a[i])
      |                         ~~^~~

For comment #2:
<source>: In function 'void fn1()':
<source>:11:14: warning: iteration 64 invokes undefined behavior
[-Waggressive-loop-optimizations]
   11 |     a[i] = i * 0x02000001;
      |            ~~^~~~~~~~~~~~
<source>:10:17: note: within this loop
   10 |   for (i = 0; i < 128; ++i)
      |               ~~^~~~~
<source>: In function 'void fn2()':
<source>:22:22: warning: iteration 112 invokes undefined behavior
[-Waggressive-loop-optimizations]
   22 |     a[i] = (i + 1LL) * 0x0123456789ABCDEFLL;
      |            ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
<source>:21:17: note: within this loop
   21 |   for (i = 0; i < 128; i++)
      |               ~~^~~~~
<source>: In function 'void fn3()':
<source>:35:16: warning: iteration 8 invokes undefined behavior
[-Waggressive-loop-optimizations]
   35 |       c[i + 8] = b[i];
      |       ~~~~~~~~~^~~~~~
<source>:33:17: note: within this loop
   33 |   for (i = 0; i < (int) (sizeof (a) / sizeof (a[0])); i++)
      |               ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>: In function 'void fn5()':
<source>:64:24: warning: iteration 950 invokes undefined behavior
[-Waggressive-loop-optimizations]
   64 |     a[23940 + j - 950] = b[j];
      |     ~~~~~~~~~~~~~~~~~~~^~~~~~
<source>:63:17: note: within this loop
   63 |   for (j = 0; j < 1140; j++)
      |               ~~^~~~~~
<source>: In function 'void fn3()':
<source>:35:16: warning: 'void* __builtin_memcpy(void*, const void*, long
unsigned int)' writing 16 bytes into a region of size 8 overflows the
destination [-Wstringop-overflow=]
   35 |       c[i + 8] = b[i];
      |       ~~~~~~~~~^~~~~~
<source>:29:31: note: at offset 8 into destination object 'c' of size 16
   29 |   unsigned char a[16], b[16], c[16];
      |                               ^
<source>:36:16: warning: 'void* __builtin_memcpy(void*, const void*, long
unsigned int)' writing 16 bytes into a region of size 8 overflows the
destination [-Wstringop-overflow=]
   36 |       a[i + 8] = b[i + 8];
      |       ~~~~~~~~~^~~~~~~~~~
<source>:29:17: note: at offset 8 into destination object 'a' of size 16
   29 |   unsigned char a[16], b[16], c[16];
      |                 ^

So this looks partialy fixed. Someone will need to do a summary of what is
fixed and not though.

Reply via email to