Я думаю, что вы сильно путаетесь с очень важной общей концепцией, которую нужно понимать при использовании C, C ++ или других низкоуровневых языков. В низкоуровневом языке есть неявное предположение, что программист знает, что он делает, и делает без ошибок программирования .
Это предположение позволяет разработчикам языка просто игнорировать то, что должно произойти, если программист нарушает правила. Конечным эффектом является то, что в C или C ++ нет гарантии "ошибки времени выполнения" ... если вы делаете что-то плохое, просто это NOT DEFINED ("неопределенное поведение" является юридическим термином ) что сейчас произойдет. Может быть сбой (если вам очень повезло), или, может быть, просто ничего (к сожалению, в большинстве случаев ... может произойти сбой в совершенно допустимом месте - миллион выполненных инструкций позже).
Например, если вы обращаетесь за пределы массива МОЖЕТ БЫТЬ вы получите сбой, а может и нет, может даже демон выйдет из вашего носа (это "носовой демон", который вы можете найти в интернете). Это не то, о чем тот, кто написал компилятору, задумался.
Просто никогда не делайте этого (если вы заботитесь о написании достойных программ).
Дополнительным бременем для тех, кто использует языки низкого уровня, является то, что вы должны очень хорошо выучить все правила и никогда не должны их нарушать. Если вы нарушаете правило, вы не можете ожидать, что «ангел ошибки времени выполнения» поможет вам ... там присутствуют только «неопределенные демоны поведения».