c - mprotect 后 malloc 导致段错误

标签 c memory-management malloc posix

在使用 mprotect() 保护内存区域后,我第一次调用 malloc() 时遇到段错误。这是执行内存分配保护的代码片段:

#define PAGESIZE 4096
void* paalloc(int size){   // Allocates and aligns memory
        int type_size =  sizeof(double);
        void* p;
        p = malloc(type_size*size+PAGESIZE-1);
        p = (void*)(((long) p + PAGESIZE-1) & ~(PAGESIZE-1));
        return p;
}
void aprotect(int size, void* array){  // Protects memory after values are set
        int type_size = sizeof(double);
        if (mprotect(array, type_size*size, PROT_READ)) {
                perror("Couldn't mprotect");
        }
}

我想使用 mprotect 来避免任何内容写入我的数组(这是预先计算的正弦/余弦值)。这是一个愚蠢的想法吗?

最佳答案

mprotect 只能以页面为单位工作,您可能已经知道。在这种情况下,您正确地将 block 的开始与页面边界对齐,但是您没有做的是确保您的分配延伸到您要访问的最后一页的末尾在其中使用。

这意味着您的 mprotect 正在保护分配结束后的数据(一直到该页的末尾),这是下一个 malloc 调用假定的空间它可以写入。

最简单的修复方法是将 malloc 调用中的 PAGE_SIZE - 1 更改为 PAGE_SIZE * 2

关于c - mprotect 后 malloc 导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687415/

相关文章:

c - Memset 段错误

无法在 STM32F429I-Disco 板上使用 FMC 读取/写入外部 SRAM

c# - CLR/从32位进程切换到64位进程后内存消耗高

c - 没有节点结构的二叉搜索树递归

c - 释放 char 指针时获取 SIGABRT

c - 如何使用 pthread 运行多个 ncurses 窗口

arrays - 当 (void *) p == (void *) *p - 标准对此有何评论?

c++ - malloc()/free()/new/delete/delete[] 的算法复杂度是多少?

c - 首先使用 malloc 设置堆?

c - 基于字符串比较的单词翻译程序——堆内存断言失败