Ошибка сегментации возникает, если вы пытаетесь получить доступ к данным на виртуальном адресе, который не сопоставлен с вашим процессом.В большинстве операционных систем память отображается в страницах по несколько килобайт;это означает, что вы часто не будете получать ошибку, если будете записывать конец массива, поскольку за ним на странице памяти следуют другие действительные данные.
Ошибка шины указывает на ошибку более низкого уровня;неверно выровненный доступ или отсутствующий физический адрес - две причины, как вы говорите.Однако первое здесь не происходит, так как вы имеете дело с байтами, которые не имеют ограничений на выравнивание;и я думаю, что второе может произойти только при доступе к данным, когда память полностью исчерпана, что, вероятно, не происходит.
Однако, я думаю, вы также можете получить ошибку шины, если попытаетесь выполнить код из недопустимоговиртуальный адрес.Это вполне может быть тем, что здесь происходит - записывая конец массива local , вы перезаписываете важные части стекового фрейма, такие как адрес возврата функции.Это приведет к возврату функции на неверный адрес, что (я думаю) приведет к ошибке шины.Это мое лучшее предположение о том, какой конкретный вид неопределенного поведения вы испытываете здесь.
В общем, вы не можете полагаться на ошибки сегментации для определения переполнения буфера;лучший инструмент, о котором я знаю, это valgrind , хотя он все равно не сможет уловить некоторые переполнения.Лучший способ избежать переполнения при работе со строками - использовать std::string
, а не делать вид, что вы пишете C.