为什么此代码不会导致缓冲区溢出

Why does this code not cause a buffer overflow?

本文关键字:缓冲区 溢出 代码 为什么      更新时间:2023-10-16

我想编写导致缓冲区溢出的代码。您能给我一些建议,说明为什么下面的测试代码不会导致缓冲区溢出?

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

#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: %dn", len);
    std::printf("buffer len: %dn", 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: %cn", i, node_reference[i]);
    }
    return 0;
}

编辑我删除了Typo de_referece线。感谢您对问题不足的回答。

sizeof(node_reference)不做您认为的事情,因为node_reference是动态分配的。您正在获得指针本身的大小,而不是指向分配的缓冲区的大小。您的buffer_lenprintf()应该向您表明。sizeof(node_reference)仅在静态分配的node_reference时才能起作用。

话虽如此,您的代码确实会导致缓冲区溢出。您正在为node_reference分配 10个字节,然后将 18个字节编写。行为是不确定的,因此可能会发生任何事情。如果您期望的话,崩溃不是保证的。您当然正在损坏内存,尽管它可能不是您通常会看到的内存,因为它不在您的分配之外。