我正在读取一些代码,这些代码mmap是一个文件,并将返回值赋给指向struct的指针:

struct cache_header {
    unsigned int signature;
    unsigned int version;
    unsigned int entries;
    unsigned char sha1[20];
};

struct cache_header *hdr;
map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
hdr = map;

后来代码verifies从文件加载的结构,这是我不明白的部分:
SHA_CTX c;
    unsigned char sha1[20];
    if (hdr->signature != CACHE_SIGNATURE)
        return error("bad signature");
    if (hdr->version != 1)
        return error("bad version");
    SHA1_Init(&c);
    SHA1_Update(&c, hdr, offsetof(struct cache_header, sha1));
    SHA1_Update(&c, hdr+1, size - sizeof(*hdr));
    SHA1_Final(sha1, &c);
    if (memcmp(sha1, hdr->sha1, 20))
        return error("bad header sha1");
    return 0;

你能解释一下原因吗:
1.在第二次呼叫hdr+1
2.在对memcmp的调用中,SHA1_Update是一个指针,它的值是否无效,因为该结构刚刚从磁盘读取,并且是由另一个代码库程序编写的。
注意:hdr->sha1是文件的大小

最佳答案

也许文件足够大,可以包含结构的两个实例?size的值是多少?
不,hdr->sha1不是指针,而是数组。该数组是struct的一部分,hdr->sha1计算为第一个元素的地址。那里没有存储指针。
另外请注意,这是一种不好的做法,因为您依赖于打包的structs(没有填充)而不确定。

07-24 09:46
查看更多