我正在读取一些代码,这些代码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
(没有填充)而不确定。