通过写入权限检查

时间:2015-11-19 09:19:50

标签: c arrays

要获取空终止字符串的长度,我们只需编写len = strlen(str)但是,我经常在SO帖子上看到,例如,要获得int数组的大小,您需要跟踪它是你自己的,这就是我正常做的。但是,我有一个问题,我们可以通过使用某种write permission check获取大小,检查我们是否具有对内存块的写权限?例如:

#include <stdio.h>

int getSize(int *arr);
bool permissionTo(int *ptr);

int main(void)
{
    int arr[3] = {1,2,3};
    int size = getSize(arr) * sizeof(int);
}

int getSize(int *arr)
{
    int *ptr = arr;
    int size = 0;
    while( permissionTo(ptr) )
    {
        size++;
        ptr++;
    }
    return size;
}
bool permissionTo(int *ptr)
{
    /*............*/
}

2 个答案:

答案 0 :(得分:6)

不,你不能。内存权限在大多数(如果不是全部)架构上都没有这种粒度。

几乎所有CPU架构都在页面中管理内存。在今天你遇到的大多数事情中,一页是4kB。没有切实可行的方法来控制任何小于此的权限。

大多数内存管理都是由你的libc从内核中分配一大块内存,然后将较小的内核分发给单个malloc调用来完成的。这样做是为了提高性能(除其他外),因为创建,删除或修改内存映射是一项昂贵的操作,尤其是在多处理器系统上。

对于堆栈(如示例所示),分配甚至更简单。内核知道&#34;这个大的内存区域将被堆栈使用&#34;和内存访问只是简单地分配必要的页面来支持它。所有跟踪程序堆栈分配的都是一个寄存器。

答案 1 :(得分:0)

如果你想要实现这一目标,那么通过携带自己的大小来分配就可以了,那么就这样做:

通过在内存中添加内存大小(从内存中写入,尚未测试)来包装malloc并释放:

void* myMalloc(long numBytes) {
    char* mem = malloc(numBytes+sizeof(long));
    ((long*)mem)[0] = numBytes;
    return mem+sizeof(long);
}
void myFree(void* memory) {
    char* mem = (char*)memory-sizeof(long);
    free(mem)
}
long memlen(void* memory) {
    char* mem = (char*)memory-sizeof(long);
    return ((long*)mem)[0];
}