Да, статический анализ показал бы, что это всегда приводит к сбою. Однако для этого потребуется, чтобы компилятор фактически выполнил этот статический анализ. Большинство компиляторов этого не делают (по крайней мере, никто из них не знает).
Поэтому вопрос таков: почему компиляторы C / C ++ не выполняют больше статической проверки типов.
Причина, по которой компилятор этого не делает, заключается в основном в традициях и философии, позволяющей сделать компилятор максимально простым.
C (и в меньшей степени C ++) были созданы в среде, где вычислительная мощность была довольно дорогой, и где была важна простота написания компилятора (потому что было много разных архитектур HW).
Поскольку статический анализ проверки типов усложнит написание компилятора и замедлит его компиляцию, в то время он не считался приоритетным. Таким образом, большинство компиляторов не имеют его.
Другие языки (например, Java) делают различные компромиссы, и поэтому в Java многие вещи недопустимы, что разрешено в C (например, недоступный код является ошибкой времени компиляции в Java; в C большинство компиляторов даже не предупреждают). Это действительно сводится к философии.
Кстати, обратите внимание, что вы можете получить статическую проверку типов в C, если хотите, - доступно несколько инструментов, например, lint (древний) или см. Какие инструменты статического анализа C ++ с открытым исходным кодом доступны? .