所以在这里我相信我在查看别人的代码时发现了一个小的缓冲区溢出问题。它立即让我觉得不正确,并且有潜在的危险,但我承认我无法解释这个“错误”的实际后果,如果有的话。
我编写了一个测试应用程序来演示该错误,但发现(令我沮丧的是)无论溢出如何,它似乎都能正常运行。我想相信这只是偶然,但想要一些反馈来确定我的想法是否错误,或者这里是否真的存在问题,只是没有在我的测试应用程序中显示出来。
问题代码(无论如何我认为是):
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 char 打印到缓冲区中并导致缓冲区溢出。
这是正确的评价吗?
我编写了一个测试应用程序来为我正在查看的代码的人演示这一点,并发现即使在调试器中字符串也会正确打印。我还尝试在此代码之前和之后将其他变量放在堆栈和堆上,以查看是否会影响相邻的内存区域,但仍能收到正确的输出。我意识到我新分配的堆内存可能不相邻,这可以解释缺乏有用的溢出,但我真的很想确认其他人的意见,如果这确实是一个问题。
由于这是一个非常简单的“问题”,如果您也可以通过某种参考来支持您的答案,那就太好了。虽然我重视并欢迎您的意见,但我不会接受“是的”作为最终答案。预先感谢您。
更新:很多很好的答案,还有很多额外的见解。不幸的是,我不能全部接受。感谢您分享您的知识并成为我的“第二意见”。我很感激帮助。