Если вы когда-либо окажетесь в ситуации, когда может произойти переполнение стека вызовов, скорее всего, ваша программа умрет насильственной смертью, прежде чем это произойдет. По крайней мере, если я понимаю, что вызовы функций работают точно.
По сути, единственный способ для этого - если вы вызываете функцию, в которой вызываемый объект очищает стек и выдает слишком много значений ... если вызывающий объект полагает, что функция принимает два параметра, но вызываемый фактически занимает три, это может случиться. Вариантом может быть функция, в которой вызываемый абонент очищает стек, а затем вызывающий снова очищает стек снова, что может произойти, если вы ошиблись в своем соглашении о вызовах. В обеих ситуациях вы, вероятно, столкнетесь с проблемой, когда перейдете по ссылке, и неправильные имена будут неправильными, но, возможно, вам просто не повезет.
В любом случае, важно то, что после вызова функции стек на один или несколько байтов короче, чем он должен быть. Теоретически программа затем продолжит работу, удалив правильное количество данных, но оставив один или несколько байтов меньше ожидаемого. В конце концов, больше нет данных для извлечения, и у вас есть переполнение стека.
Однако при обращении к стеку адреса относятся к вершине. Таким образом, компилятор будет искать конкретный объект в [top of stack + 3], если он находится в трех байтах от вершины стека. Это все равно будет сделано, если стек окажется короче ожидаемого, и будет искать этот объект в неправильном месте. Предполагая, что объект даже все еще там ... он, возможно, уже случайно оторвался. Когда вы дойдете до конца любой функции, в которой вы находитесь, она может не найти правильный адрес возврата по той же причине, но даже если это произойдет, внезапное повреждение всех ваших объектов - довольно тяжелая ситуация .
Предостережение: все это основано на предположении, что современные системы ведут себя так же, как старые микроконтроллеры, с которыми я работал десять лет назад. Может быть, они умнее, чем сейчас.