为什么分配给堆栈中的局部变量的内存比C ++所需的内存多?

Arpit

我正在阅读有关缓冲区溢出的信息。我发现有关堆栈上局部变量的内存分配的一件奇怪的事

int f1 ()
{
    char string1[12];
    char string2[4];
}

这里分配发生在堆栈上。

现在,在GCC中string2被分配了4个字节,但是如果我声明2的幂(最多16),那么编译器将为它分配16个字节。这意味着如果我在3、5、6、7,....,15字节中分配string2,那么编译器会为它分配16字节,但是如果我以1,2,4,8的2幂进行分配,则...然后分配给它完全相同的大小。如果我分配超过16个字节(不是2的幂),则它将分配32个字节(我猜最多为32个字节)。

而在Visual Studio中,如果我分配1个字节,则分配9个字节,如果从2-4个字节,则分配12个字节,如果从5-8个字节,则由编译器分配16个字节。

谁知道为什么这样的任务???

Atleast在Visual Studio中,如果缓冲区溢出,我会收到调试错误,但在gcc中什么也没有发生。GCC仅在发生太大溢出时才提供分段错误。

汉斯·帕桑特

堆栈帧大小受内存对齐选择的影响,对于32位代码,通常为4的倍数,对于64位代码为8的倍数。

两种编译器都可以使用canary进行堆栈框架损坏检查,canary是堆栈顶部的32位额外值,该值在函数入口处初始化并在函数出口处进行检查。如果Canary值更改,则由于堆栈帧很可能被恶意代码破坏而导致程序中止,这可能会更改函数返回地址并使它返回任意位置。一个非常流行的恶意软件注入媒介。

MSVC具有/ RTC选项,默认情况下在Debug配置中启用。这将这些金丝雀添加到每个局部变量之间。因此,它可以检测每个变量上的缓冲区溢出问题。

这些金丝雀当然会占用额外的空间,从而影响堆栈的框架大小。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么分配给堆栈中的局部变量的内存比C ++所需的内存多?

来自分类Dev

局部变量的内存被重新分配 - 为什么

来自分类Dev

C ++内存管理在局部变量上的内存分配

来自分类Dev

浪费内存分配局部变量

来自分类Dev

为什么内存没有分配给数组?

来自分类Dev

什么是内存模型中的局部变量和对象?

来自分类Dev

C ++中变量的堆栈内存分配

来自分类Dev

如何在shell中“释放”分配给变量的内存

来自分类Dev

何时将内存分配给变量

来自分类Dev

无法将内存分配给c中的指针

来自分类Dev

是否在CPython中将内存分配给堆栈上的指针?

来自分类Dev

为什么在不使用堆栈内存时分配堆栈内存?

来自分类Dev

将malloc的变量值分配给新变量,新变量是否也在堆内存中?

来自分类Dev

在C中,内存分配失败,为什么?

来自分类Dev

GCC 不同的实际内存分配量然后我分配给程序中的变量

来自分类Dev

为什么强制垃圾回收会增加分配给Java进程的内存?

来自分类Dev

为什么将文本分配给指针会将内存位置存储到文本?

来自分类Dev

重新定义变量后,为什么编译器将不同的内存地址分配给同一变量?

来自分类Dev

当通过引用传递局部变量时,c ++如何处理局部变量的内存?

来自分类Dev

为什么在boost进程间共享内存中分配的对象占用的内存比所需的更多?

来自分类Dev

iOS:方法中定义的局部变量的内存占用量

来自分类Dev

局部变量是否保留在javascript的内存中?

来自分类Dev

堆栈中的内存分配

来自分类Dev

所需的动态内存字节

来自分类Dev

Java内存模型和局部变量

来自分类Dev

C动态内存分配给void指针

来自分类Dev

解决错误“与返回的局部变量关联的堆栈内存地址”

来自分类Dev

为什么这个Haskell程序分配这么多内存?

来自分类Dev

将内存分配给c中的字符串数组

Related 相关文章

  1. 1

    为什么分配给堆栈中的局部变量的内存比C ++所需的内存多?

  2. 2

    局部变量的内存被重新分配 - 为什么

  3. 3

    C ++内存管理在局部变量上的内存分配

  4. 4

    浪费内存分配局部变量

  5. 5

    为什么内存没有分配给数组?

  6. 6

    什么是内存模型中的局部变量和对象?

  7. 7

    C ++中变量的堆栈内存分配

  8. 8

    如何在shell中“释放”分配给变量的内存

  9. 9

    何时将内存分配给变量

  10. 10

    无法将内存分配给c中的指针

  11. 11

    是否在CPython中将内存分配给堆栈上的指针?

  12. 12

    为什么在不使用堆栈内存时分配堆栈内存?

  13. 13

    将malloc的变量值分配给新变量,新变量是否也在堆内存中?

  14. 14

    在C中,内存分配失败,为什么?

  15. 15

    GCC 不同的实际内存分配量然后我分配给程序中的变量

  16. 16

    为什么强制垃圾回收会增加分配给Java进程的内存?

  17. 17

    为什么将文本分配给指针会将内存位置存储到文本?

  18. 18

    重新定义变量后,为什么编译器将不同的内存地址分配给同一变量?

  19. 19

    当通过引用传递局部变量时,c ++如何处理局部变量的内存?

  20. 20

    为什么在boost进程间共享内存中分配的对象占用的内存比所需的更多?

  21. 21

    iOS:方法中定义的局部变量的内存占用量

  22. 22

    局部变量是否保留在javascript的内存中?

  23. 23

    堆栈中的内存分配

  24. 24

    所需的动态内存字节

  25. 25

    Java内存模型和局部变量

  26. 26

    C动态内存分配给void指针

  27. 27

    解决错误“与返回的局部变量关联的堆栈内存地址”

  28. 28

    为什么这个Haskell程序分配这么多内存?

  29. 29

    将内存分配给c中的字符串数组

热门标签

归档