我想编写导致缓冲区溢出的代码。您能否就我下面的测试代码导致缓冲区溢出的原因给出一些建议?
我认为此行应该发生缓冲区溢出:
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
#define buffer_size 10
int main(){
string m_string = "My name is String";
char* node_reference = new char[buffer_size];
unsigned int len = strlen(m_string.c_str());
unsigned int buffer_len = sizeof(node_reference)/sizeof(char);
std::printf("len: %d\n", len);
std::printf("buffer len: %d\n", buffer_len);
for (unsigned int i = 0; i < strlen(m_string.c_str()) + 1; i++) {
node_reference[i] = m_string[i];
std::printf("index: %d and value: %c\n", i, node_reference[i]);
}
return 0;
}
修改 我删除了错字de_referece行。感谢您对问题不足的答复。
答案 0 :(得分:3)
sizeof(node_reference)
没有按照您的想法执行,因为node_reference
是动态分配的。您正在获取指针本身的大小,而不是指向的已分配缓冲区的大小。 printf()
buffer_len
sizeof(node_reference)
应该已经向您表明了这一点。 node_reference
仅在静态分配node_reference
时才有效。
话虽如此,您的代码会导致缓冲区溢出。您为{{1}}分配 10个字节,然后将 18个字节写入其中。行为未定义,因此任何都可能发生。如果这是你期望的,那么崩溃不是保证。你肯定会破坏内存,虽然它可能不是你通常会看到的内存,因为它超出你的分配范围。