为什么此代码不会导致缓冲区溢出
Why does this code not cause a buffer overflow?
我想编写导致缓冲区溢出的代码。您能给我一些建议,说明为什么下面的测试代码不会导致缓冲区溢出?
我认为在此行上应该发生缓冲区溢出:
#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_len
的printf()
应该向您表明。sizeof(node_reference)
仅在静态分配的node_reference
时才能起作用。
话虽如此,您的代码确实会导致缓冲区溢出。您正在为node_reference
分配 10个字节,然后将 18个字节编写。行为是不确定的,因此可能会发生任何事情。如果您期望的话,崩溃不是保证的。您当然正在损坏内存,尽管它可能不是您通常会看到的内存,因为它不在您的分配之外。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 使用向量的缓冲区溢出
- 重新增长阵列时出错:写入时缓冲区溢出
- Leetcode 1366:堆缓冲区溢出
- 缓冲区溢出 - 数组索引越界(严重)
- C++二维矢量导致缓冲区溢出
- 缓冲区溢出怎么会成为黑客的攻击
- 如何防止缓冲区溢出
- 应该如何读取堆缓冲区溢出错误消息?
- 自动截断和 null 终止缓冲区溢出中的字符串缓冲区
- 如果用户输入两个或多个由空格分隔的字符串C++如何防止缓冲区溢出?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 为什么 LeetCode 给出错误:地址清理器:堆缓冲区溢出
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- 读取文件时字符缓冲区溢出
- C 文本写入随机数据.是否有缓冲区溢出