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

            Bug ID: 120425
           Summary: GCC-compiled with -O{1,2,s,3} program got segfault
                    from GCC 12.1
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: congli at smail dot nju.edu.cn
  Target Milestone: ---

Starting with GCC version 12.1, compiling the following t.c using optimization
flags -O1, -O2, -Os, or -O3 results in a segmentation fault at runtime.

```
$ cat t.c
unsigned a[] = {
    0,          4,          8,          4,          124634137,  5,
    5,          5,          249268274,  2044508324, 0,          4,
    5,          1,          3887607047, 2428444049, 8,          1789927666,
    4089016648, 4,          50548861,   3,          107580753,  2211677639,
    0,          2,          4251122042, 2321926636, 7,          5,
    5,          7,          7073096,    6,          2,          2,
    1006888145, 607687,     101629,     3,          901097722,  1119000684,
    6,          8065728,    1,          1,          705015759,  5,
    651767980,  6,          4,          104598,     565507253,  1,
    3485111705, 3099436303, 4,          1594198024, 30930,      70347812,
    795835527,  1483230225, 5,          3060149565, 2,          4,
    2563907772, 4023717930, 907459465,  112637215,  3,          904427059,
    2013776290, 6,          4,          3775830040, 3,          3,
    9,          7,          802195444,  6,          8001368,    4066508878,
    70925,      3092731,    2181625025, 3,          706088902,  4,
    2344532202, 2,          1,          366619977,  3,          5,
    1303535960, 6,          7007092,    3569037538, 70817,      1,
    3,          3554079995, 6,          6,          2909243462, 6,
    7,          7,          1,          708648649,  8,          654459306,
    6048,       4,          1466479909, 544179635,  10523913,   5,
    4,          702138776,  0,          2,          504918807,  783551873,
    3082640443, 9,          4,          2596254646, 7068,       1957810842,
    5,          2647816111, 70997,      1943803523, 0,          4,
    0,          2053790376, 3826175755, 3,          3,          2097651377,
    4027552580, 2265490386, 2,          1762050814, 5,          5,
    5,          1852507879, 6,          0,          6,          2,
    708143,     5,          397917763,  7,          604390888,  8,
    953729732,  6,          3518719985, 60999,      1068828381, 9,
    0,          8,          906185462,  1090812512, 3747672003, 9,
    5,          1,          4,          60834842,   628085408,  1382605366,
    3423369109, 8078467,    570562233,  400815,     3317316542, 608,
    4,          1555261956, 1,          5,          3,          1541320221,
    607071920,  0,          2,          40735498,   2617837225, 1,
    3087877,    83908371,   4,          803740692,  2075208622, 213261112,
    3,          90285,      2094854071, 1,          2029012,    0,
    2,          0,          1,          5,          1873836001, 7,
    4,          200368,     4,          6,          2405801727, 5,
    5,          1,          5067896,    608007406,  1308918612, 8,
    808555105,  3495958263, 1,          5,          8,          3654703836,
    1088359270, 0,          9,          9,          202900863,  7,
    108,        0,          1404277552, 0,          207493,     3453421203,
    1423857449, 1,          3009837614, 3294710456, 1567103746, 711928724,
    3020668471, 3272380065, 5,          755167117};
int b, c[] = {1911263494,  774465782,  4379194,    669572660,  -1452495846,
              -1658729425, 1103267782, -90393310,  1635864740, -1,
              -1238002948, -351663323, -576056573, 1233623753, -1844776976,
              -1531764644, -319456054, 1797911602, -684072473, -1155699931};
int h(int i) {
  unsigned e = 4294967295;
  for (int d = 0; d < i; ++d) {
    e = e >> 8 ^ a[(e ^ c[d]) & 255];
    e = e >> 8 ^ a[(e ^ c[d] >> 8) & 255];
    e = e >> 8 ^ a[(e ^ c[d] >> 16) & 255];
    e = e >> 8 ^ a[(e ^ c[d] >> 24) & 255];
  }
  e = e ^ 4294967295;
  return e;
}
int main() {
  int f = 987751161, g = -1211051206;
  goto aq;
g:
  f = -b + g - 1767812960;
aq:
  b = -f;
  if ((h(20) + 1788482227) * b >= 0)
    return 0;
  while (h(0))
    __builtin_abort();
  goto g;
}

$ gcc -O1 t.c
$ ./a.out                     # <-- segfault
```

See also Compiler Explore: https://godbolt.org/z/5v4dq5M7M

Reply via email to