C 通过写权限检查获取数组大小

C 通过写权限检查获取数组大小,c,arrays,C,Arrays,要获得以null结尾的字符串的长度,我们只需编写len=strlen(str),然而,我经常在这里看到这样的帖子,比如说要获得int数组的大小,你需要自己跟踪它,这是我通常做的。但是,我有一个问题,我们是否可以使用某种写权限检查来获得大小,该检查检查我们是否有对内存块的写权限?例如: #include <stdio.h> int getSize(int *arr); bool permissionTo(int *ptr); int main(void) { int arr

要获得以null结尾的字符串的长度,我们只需编写
len=strlen(str)
,然而,我经常在这里看到这样的帖子,比如说要获得
int
数组的大小,你需要自己跟踪它,这是我通常做的。但是,我有一个问题,我们是否可以使用某种
写权限检查来获得大小,该检查检查我们是否有对内存块的写权限?例如:

#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)
{
    /*............*/
}
#包括
int getSize(int*arr);
bool许可证(int*ptr);
内部主(空)
{
int-arr[3]={1,2,3};
int size=getSize(arr)*sizeof(int);
}
int getSize(int*arr)
{
int*ptr=arr;
int size=0;
while(许可证(ptr))
{
大小++;
ptr++;
}
返回大小;
}
bool许可证(int*ptr)
{
/*............*/
}

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

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

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


对于堆栈(如您的示例中所示),分配更加简单。内核知道“这个大内存区域将被堆栈使用”,对它的内存访问只是简单地分配必要的页面来支持它。跟踪程序对堆栈分配所做的所有操作都是一个寄存器。

如果您正试图实现,则可以通过携带自己的大小使分配变得易于使用,然后执行以下操作:

通过在内存内部加上大小前缀(从内存写入,尚未测试),包装malloc并释放:


此外,您可能有权限写入数组之外的数据:
int data[8];你也有写这封信的权限
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];
}