为什么这段代码不会导致缓冲区溢出?

时间:2017-03-11 01:00:27

标签: c++

我想编写导致缓冲区溢出的代码。您能否就我下面的测试代码导致缓冲区溢出的原因给出一些建议?

我认为此行应该发生缓冲区溢出:

#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行。感谢您对问题不足的答复。

1 个答案:

答案 0 :(得分:3)

sizeof(node_reference)没有按照您的想法执行,因为node_reference是动态分配的。您正在获取指针本身的大小,而不是指向的已分配缓冲区的大小。 printf() buffer_len sizeof(node_reference)应该已经向您表明了这一点。 node_reference仅在静态分配node_reference时才有效。

话虽如此,您的代码导致缓冲区溢出。您为{{1}}分配 10个字节,然后将 18个字节写入其中。行为未定义,因此任何都可能发生。如果这是你期望的,那么崩溃不是保证。你肯定会破坏内存,虽然它可能不是你通常会看到的内存,因为它超出你的分配范围。