Вы не можете сделать это со стеком, который растет без полной замены модели адресации для всех массивов. Это жизнеспособный вариант реализации, но он не совместим с существующими ABI.
Что вы заметили, так это то, что в некотором смысле наличие растущего стека (где вверх - направление положительного индекса массива) в некоторыхспособы безопаснее, чем стек, который растет. Тем не менее, это не намного безопаснее. Подумайте, что происходит, когда вы передаете адрес массива с автоматическим хранением другой функции. Вызываемый объект будет отображаться в стеке выше, чем массив, поэтому любое переполнение массива будет перетекать в кадр стека вызываемого, возможно, включая его адрес возврата. Например:
void foo()
{
char s[4];
strcpy(s, "hello world");
}
Когда возвращается strcpy
, его адрес возврата, возможно, был забит путем сохранения за концом массива, адрес которого был ему передан.