Итак, здесь я считаю, что у меня небольшая проблема с переполнением буфера, которую я обнаружил при просмотре кода другого пользователя. Это сразу показалось мне неправильным и потенциально опасным, но, по общему признанию, я не мог объяснить ФАКТИЧЕСКИЕ последствия этой "ошибки", если таковые имеются.
Я написал тестовое приложение, чтобы продемонстрировать ошибку, но обнаружил (к моему ужасу), что он работает правильно, независимо от переполнения. Я хочу верить, что это просто случайно, но мне нужна была некоторая обратная связь, чтобы определить, были ли мои мысли неправильными или если здесь действительно проблема, которая просто не показывает свою голову в моем тестовом приложении.
Код проблемы (я думаю, это так или иначе):
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 char long" ). sprintf
, я полагаю, затем печатает 27 char в буфер и вызвал переполнение буфера.
Это правильная оценка?
Я написал тестовое приложение, чтобы продемонстрировать это для человека, к которому я обращался, и обнаружил, что даже в отладчике строка будет печататься правильно. Я также пытаюсь поместить другие переменные в стек и кучу до и после этого кода, чтобы увидеть, могу ли я повлиять на соседние области памяти, но все еще получал правильный вывод. Я понимаю, что моя недавно выделенная память кучи не может быть смежной, что объясняет отсутствие полезного переполнения, но я просто хотел подтвердить мнение других, если это действительно проблема.
Поскольку это довольно простой "вопрос", было бы неплохо, если бы вы могли поддержать свой ответ с помощью какой-то ссылки. Хотя я ценю и приветствую ваш вклад, я не собираюсь принимать "да, это" в качестве окончательного ответа. Благодарим вас заблаговременно.
Обновление: Много хороших ответов с большим количеством дополнительной информации. К сожалению, я не могу принять их всех. Спасибо, что поделились своими знаниями и за то, что являетесь моим "вторым мнением". Я ценю помощь.