if (x + 1 < x) для знакового int не защищает от переполнения. Знаковое переполнение в C является неопределённым поведением, поэтому компилятор вправе считать, что x + 1 никогда не переполняется, решить, что условие ложно, и выбросить ветку. Распространённые компиляторы так и делают, как только включена оптимизация.
Это проблема безопасности, потому что исчезает обычно та самая проверка, что стоит перед длиной для malloc или memcpy. На ревью исходник выглядит безопасным. В бинарнике проверки нет.
Проверяйте до операции. if (x > INT_MAX - 1) для простого случая. Для сложения в общем виде есть __builtin_add_overflow в GCC и Clang или ckd_add из <stdckdint.h>, если ваш инструментарий поддерживает C23. -fwrapv заставляет знаковое переполнение заворачиваться на компиляторах, где этот флаг есть. Как смягчение годится, но это не переносимый C. А беззнаковая арифметика вроде size_t заворачивается по определению, что означает лишь корректно определённую неверную длину, так что и там сравнивайте с пределом явно.
Правило занимает одно предложение в разделе 6.5 стандарта. Им объясняется немало баг-репортов, обвиняющих оптимизатор.