Итак, я считаю, что у меня возникла небольшая проблема с переполнением буфера, которую я обнаружил при просмотре чужого кода.Это сразу показалось мне неправильным и потенциально опасным, но по общему признанию я не мог объяснить ФАКТИЧЕСКИЕ последствия этой «ошибки», если таковые имеются.
Я написал тестовое приложение, чтобы продемонстрировать ошибку, но нашел(к моему ужасу), что он работает правильно, независимо от переполнения.Я хочу верить, что это просто случайно, но хотел получить обратную связь, чтобы определить, было ли мое мышление неправильным или действительно есть проблема, которая просто не проявляет себя в моем тестовом приложении.
Код проблемы (я так думаю, в любом случае):
char* buffer = new char[strlen("This string is 27 char long" + 1)];
sprintf(buffer, "This string is 27 char long");
Теперь причина, по которой я это выделил, и я хочу пометить его как возможное переполнение буфера, связана с первым strlen
.Из-за арифметики указателей, «неправильное» размещение + 1
приведет к тому, что strlen
вернет 26
вместо 27
(принимая длину «его строка длиной 27 символов»).sprintf
, я полагаю, затем печатает 27 символов в буфер и вызывает переполнение буфера.
Это правильная оценка?
Я написал тестовое приложение, чтобы продемонстрировать это человекукто код, который я смотрел, и обнаружил, что даже в отладчике строка будет печататься правильно.Я также пытался поместить другие переменные в стек и кучу до и после этого кода, чтобы посмотреть, смогу ли я повлиять на соседние области памяти, но все еще получал правильный вывод.Я понимаю, что моя недавно выделенная память кучи может не быть смежной, что объясняет отсутствие полезного переполнения, но я просто очень хотел подтвердить мнение других, если это на самом деле проблема.
Так как этодовольно простой «вопрос», было бы неплохо, если бы вы могли поддержать свой ответ с какой-то ссылкой.Хотя я ценю и приветствую ваш вклад, я не собираюсь принимать «да, это так» в качестве окончательного ответа.Заранее благодарим.
Обновление: Много хороших ответов с большим количеством дополнительной информации.К сожалению, я не могу принять их всех.Спасибо, что поделились своими знаниями и за то, что были моим «вторым мнением».Я ценю помощь.