c++ - linux会不会阻止栈和堆互相生长?

标签 c++ linux memory

全部 我写这个cpp代码来测试堆栈和头部。而且我发现 Linux 并没有阻止那个事件。 (Linux devlinux11 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:39:47 EDT 2008 i686 i686 i386 GNU/Linux gcc 版本 3.4.6 20060404(红帽 3.4.6-10)) 有什么办法可以防止这种情况发生吗?

#include <iostream>
using namespace std;
const int _1_m = 10 * 1024 * 1024;
const int _1_k = 1024 * 110;

void testStack();

int main(int argc, char** argv)
{

    char* cur = (char*)calloc(_1_m, 1);
    char* prev = 0;
    while( cur != 0)
    {
        prev = cur;
        cur = (char*)calloc(_1_m, 1);
    }

    cout << "Hi, Da:" << endl;

    for (int i=0; i< _1_m; i++)
    {
        if (prev[i])
        {
            cout << "Nothing to say....." << endl;
            break;
        }

    }

    cout << "[God is tesing you ......]" << endl;

    testStack();

    for (int i=0; i< _1_m; i++)
    {
        if (prev[i])
        {
            cout << "You're a super man!!!" << endl;
            return 0;
        }

     }

    cout<< " You're a bad guy!!!!!" << endl;
    return 0;
}
void testStack()
{
char a1[_1_k] = {0};
char a2[_1_k] = {0};
char a3[_1_k] = {0};
char a4[_1_k] = {0};
char a5[_1_k] = {0};
char a6[_1_k] = {0};
char a7[_1_k] = {0};
char a8[_1_k] = {0};
char a9[_1_k] = {0};
char a10[_1_k] = {0};
char a11[_1_k] = {0};
char a12[_1_k] = {0};
char a13[_1_k] = {0};
char a14[_1_k] = {0};
char a15[_1_k] = {0};
char a16[_1_k] = {0};
char a17[_1_k] = {0};
char a18[_1_k] = {0};
char a19[_1_k] = {0};
char a20[_1_k] = {0};
char a21[_1_k] = {0};
char a22[_1_k] = {0};
char a23[_1_k] = {0};
char a24[_1_k] = {0};
char a25[_1_k] = {0};
char a26[_1_k] = {0};
char a27[_1_k] = {0};
char a28[_1_k] = {0};
char a29[_1_k] = {0};
char a30[_1_k] = {0};
char a31[_1_k] = {0};
char a32[_1_k] = {0};
char a33[_1_k] = {0};
char a34[_1_k] = {0};
char a35[_1_k] = {0};
char a36[_1_k] = {0};
char a37[_1_k] = {0};
char a38[_1_k] = {0};
char a39[_1_k] = {0};
char a40[_1_k] = {0};
char a41[_1_k] = {0};
char a42[_1_k] = {0};
char a43[_1_k] = {0};
char a44[_1_k] = {0};
char a45[_1_k] = {0};
char a46[_1_k] = {0};
char a47[_1_k] = {0};
char a48[_1_k] = {0};
char a49[_1_k] = {0};
char a50[_1_k] = {0};
char a51[_1_k] = {0};
char a52[_1_k] = {0};
char a53[_1_k] = {0};
char a54[_1_k] = {0};
char a55[_1_k] = {0};
char a56[_1_k] = {0};
char a57[_1_k] = {0};
char a58[_1_k] = {0};
char a59[_1_k] = {0};
char a60[_1_k] = {0};
char a61[_1_k] = {0};
char a62[_1_k] = {0};
char a63[_1_k] = {0};
char a64[_1_k] = {0};
char a65[_1_k] = {0};
char a66[_1_k] = {0};
char a67[_1_k] = {0};
char a68[_1_k] = {0};
char a69[_1_k] = {0};
char a70[_1_k] = {0};
char a71[_1_k] = {0};
char a72[_1_k] = {0};
char a73[_1_k] = {0};
char a74[_1_k] = {0};
char a75[_1_k] = {0};
char a76[_1_k] = {0};
char a77[_1_k] = {0};
char a78[_1_k] = {0};
char a79[_1_k] = {0};
char a80[_1_k] = {0};
char a81[_1_k] = {0};
char a82[_1_k] = {0};
char a83[_1_k] = {0};
char a84[_1_k] = {0};
char a85[_1_k] = {0};
char a86[_1_k] = {0};
char a87[_1_k] = {0};
char a88[_1_k] = {0};
char a89[_1_k] = {0};
char a90[_1_k] = {0};
char a91[_1_k] = {0};
char a92[_1_k] = {0};
char a93[_1_k] = {0};
char a94[_1_k] = {0};
char a95[_1_k] = {0};
char a96[_1_k] = {0};
char a97[_1_k] = {0};
char a98[_1_k] = {0};
char a99[_1_k] = {0};
char a100[_1_k] = {0};
 for (int i =0 ; i < _1_k; i++)
 {
  a100[i] = 1;
 }
}

最佳答案

您的 Linux 版本已过时或无人维护。这是在更新的版本中修复的,因为它在 Xorg 中引入了安全漏洞。如果您的发行版没有向后移植这个补丁,那么您应该远离它。

参见 http://git.kernel.org/linus/320b2b8de12698082609ebbc1a17165727f4c893对于补丁, 或者 http://www.invisiblethingslab.com/resources/misc-2010/xorg-large-memory-attacks.pdf有关缺陷的描述。

关于c++ - linux会不会阻止栈和堆互相生长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4568789/

相关文章:

c++ - 在 C++ 中访问矩阵的多个元素

c++ - 在 Qt Creator 中自动增加内部版本号

linux - 提取没有同名目录的文件

php - 我需要允许我网站的用户上传图片 - 我可以在不将文件夹权限设置为 777 的情况下上传图片吗

c - 如果我有一个二进制数 1111111111111111 并且 Intel 处理器使用的存储格式是 32 位,那么 float 的值是多少?

c++ - 数组 : convert index of one dimensional array to a vector index of a multidimensional array

c++ - 覆盖 C++ 中的非虚继承

linux - 在进程中使用互斥量/信号量

c++ - 大型矩阵的 uint8_t 和未指定 int 之间的区别

java - 在 JVM 外部分配内存并在 JVM 内部使用它