包含溢出缓冲区的堆栈分配变量是否也称为缓冲区?

时间:2015-03-13 04:06:27

标签: c++

我想澄清包含溢出的堆栈分配变量是否也称为缓冲区?或者它是指文本段,堆段或堆栈段等内存区域?

例如......

void func(char* arg3)
{
    char buf[5];
    strcpy(buf, arg3);
}

int main()
{
    char *display = "HelloWorld";
    func (display); //buffer overflow since HelloWorld consists of 10 characters
                    // while the buffer is only 5...
}

寻找变量的名称或使用术语来表示包含溢出缓冲区的变量。

2 个答案:

答案 0 :(得分:0)

http://en.wikipedia.org/wiki/Data_buffer

  

数据缓冲区(或仅缓冲区)是物理内存的区域   存储用于在移动数据时临时存储数据   一个地方到另一个地方。

它与堆栈/堆等无关。
并且溢出不会吞下其他变量的目的

答案 1 :(得分:0)

执行时......

char buf[5];
strcpy(buf, arg3);

... arg3指向更长的字符串,程序可能会在为buf保留的堆栈内存后尝试写入内存,这会导致未定义的行为 。您的程序无法正常运行,可能会损坏数据,输出垃圾,挂起,崩溃等。

  

我想澄清包含溢出的堆栈分配变量是否也称为缓冲区?

堆栈分配的变量 - 即buf - 甚至没有尝试"包含" "溢出"。无效代码会破坏内存,很可能会破坏堆栈中的内存,但是如果堆栈几乎已满,您甚至可能会尝试写入堆栈末尾。 buf本身可以合理地被视为buffer

  

或者它指的是文本段,堆段或堆栈段等内存区域?

不确定你在这里猜测的是什么。 buf位于堆栈上,指针display(如果它没有被优化掉),而字符"HelloWorld\0"可能位于只读数据段中(传统的rodata段或.rodata)。