我认为我发现了一个小的缓冲区溢出问题,这是我在审查别人代码时发现的。它立即让我感到不正确,而且可能很危险,但是坦率地说,我无法解释这个“错误”的实际后果(如果有的话)。
我编写了一个测试应用程序来演示错误,但是发现(令我失望的是),似乎无论溢出与否,它都能正常运行。我想相信这只是偶然发生的,但是想要一些反馈,以确定我的想法是否正确,或者是否真的存在一些问题,只是在我的测试应用程序中没有显示出来。
我认为以下是有问题的代码:
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
(即“his string is 27 char long”的长度)。我认为sprintf
然后会将27个字符打印到缓冲区中,并导致缓冲区溢出。
这是正确的评估吗?
我编写了一个测试应用程序来演示这一点,以向我查看其代码的人展示,并发现即使在调试器中,字符串也将正确打印。我还尝试在此代码之前和之后将其他变量放在堆栈和堆上,以查看是否可以影响相邻的内存区域,但仍然收到正确的输出。我意识到我的新分配的堆内存可能不相邻,这可能解释了缺乏有用的溢出,但我只是想确认其他人的意见,是否确实存在问题。
由于这是一个相当简单的“问题”,如果您能提供某种参考资料作为支持答案,那就太好了。虽然我珍视并欢迎您的意见,但我不会接受“是的”作为最终答案。非常感谢您的帮助。
更新:很多好的答案提供了很多额外的见解。不幸的是,我不能接受它们全部。感谢您分享您的知识,并成为我的“第二意见”。我感激您的帮助。
sprintf
之前分配两个这样的字符串,并以不同的顺序填充它们。 - Christopher Creutzig