Я привожу в пример C++ потому, что зная как он работает начинает
приоткрываться принцип работы и C компилятора тоже (благо внутри
там у GCC и Clang для обоих языков один "движок"). В языке C нет
некоторых вещей (шаблонов, ADL), что не даёт понять, например,
почему тип важен и как тип может управлять компиляцией. Для C
программиста может быть не очевидно, а C++ программист запросто
может написать свой самодельный memcpy ровно с такими же "багами"
пользуясь только средствами языка и не полагаясь на оптимизацию от компилятора (т.е. чтоб в зависимости размера выравнивания подсунутого типа вызывались разные реализации memcpy):
https://godbolt.org/z/G11vbx
И гудвиновский "баг" в конце прекрасно видно.