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

--- Comment #8 from Martin Sebor <msebor at gcc dot gnu.org> ---
Created attachment 52574
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52574&action=edit
Output of debug_ranger() for the affected function.

The IL the first warning triggers for in the test case in comment #7 is below. 
The access to header[header_bytes_152] where header_bytes_152's value is in [8,
8][10, 10] is out of bounds for unsigned char[8].  So the warning is correctly
pointing out the invalid store.  The store is the result of GCC unrolling the
first six iterations of the while loop, starting with index 4 (stores at index
2 and 3 are hoisted above the unrolled loop).  The last two iterations store
past the end of the header array.  GCC 11 also unrolls six iterations of the
loop but it starts with index 2 (it doesn't hoist the first two stores above
it).  The attachment shows the full output of calling debug_ranger() on the
function.

=========== BB 13 ============
Imports: header_bytes_192  
Exports: _147  header_bytes_152  header_bytes_192  
         _147 : header_bytes_152  header_bytes_192(I)  
         header_bytes_152 : header_bytes_192(I)  
header_bytes_192        unsigned int [4, 4][6, 6]
Relational : (header_bytes_152 > header_bytes_192)
    <bb 13> [local count: 21246984]:
    header_bytes_152 = header_bytes_192 + 4;
    header[header_bytes_65] = 0;
    _147 = header_bytes_152 & 3;
    if (_147 != 0)
      goto <bb 14>; [85.71%]
    else
      goto <bb 20>; [14.29%]

_147 : unsigned int [0, 0][2, 2]
header_bytes_152 : uint32_t [8, 8][10, 10]
13->14  (T) _147 :      unsigned int [2, 2]
13->14  (T) header_bytes_152 :  uint32_t [8, 8][10, 10]
13->14  (T) header_bytes_192 :  unsigned int [4, 4][6, 6]
13->20  (F) _147 :      unsigned int [0, 0]
13->20  (F) header_bytes_152 :  uint32_t [8, 8][10, 10]
13->20  (F) header_bytes_192 :  unsigned int [4, 4][6, 6]

=========== BB 14 ============
Imports: header_bytes_192  
Exports: _131  header_bytes_133  header_bytes_192  
         _131 : header_bytes_133  header_bytes_192(I)  
         header_bytes_133 : header_bytes_192(I)  
header_bytes_192        unsigned int [4, 4][6, 6]
Relational : (header_bytes_133 > header_bytes_192)
    <bb 14> [local count: 18210790]:
    header_bytes_133 = header_bytes_192 + 5;
    header[header_bytes_152] = 0;    <<< -Wstringop-overflow
    _131 = header_bytes_133 & 3;
    if (_131 != 0)
      goto <bb 15>; [85.71%]
    else
      goto <bb 21>; [14.29%]

_131 : unsigned int [1, 1][3, 3]
header_bytes_133 : uint32_t [9, 9][11, 11]
14->15  (T) _131 :      unsigned int [1, 1][3, 3]
14->15  (T) header_bytes_133 :  uint32_t [9, 9][11, 11]
14->15  (T) header_bytes_192 :  unsigned int [4, 4][6, 6]
14->21  (F) _131 :      UNDEFINED
14->21  (F) header_bytes_133 :  UNDEFINED
14->21  (F) header_bytes_192 :  UNDEFINED

Reply via email to