В дополнение к проблеме с аннулированием итератора, есть аргумент безопасности, позволяющий избежать оптимизации небольшого буфера.
Если запись перезапускает std::vector
, вы получаете повреждение кучи, что довольно сложно предсказать, что перезаписывается, и очень трудно использовать для выполнения произвольного кода.
Если буфер вместо этого встроен в локальную переменную, переполнение уничтожает стек, и злоумышленник, вероятно, получит контроль над обратным адресом, что гораздо полезнее (например, атака с возвратом в libc).