Linux内核中的代码(可能是驱动程序):
检查* data_ptr
的大小sizeof(*data_ptr)
像这样:
uint32_t *data_ptr = cfg_data +
reg_cfg_cmd->u.rw_info.cmd_data_offset/4;
if ((UINT_MAX - sizeof(*data_ptr) <
reg_cfg_cmd->u.rw_info.reg_offset) ||
(resource_size(vfe_dev->vfe_mem) <
reg_cfg_cmd->u.rw_info.reg_offset +
sizeof(*data_ptr))) {
pr_err("%s: VFE_WRITE_MB: Invalid length\n", __func__);
return -EINVAL;
}
是
的大小uint32_t * data_ptr
未定?它似乎应该总是4个字节。
更新:
如果是这样,
是什么意思UINT_MAX - sizeof(*data_ptr)
实际上这是一项安全检查,此处出现漏洞。该代码稍后修补:
答案 0 :(得分:2)
不,它可能不是四个字节。标准(即ISO)C中的字节不一定是8位。当提到特定的八位项时,标准通常会使用术语“八位字节”。
而字节是最小尺寸的自然数据元素。如果这是16位数据类型,那么int32_t
的大小将是2而不是4。
鉴于Linux及其类似架构的种类繁多,您应该允许这样的变体。考虑到C代码经常进入完全不同的系统的可能性,如果可能的话,通常更好的是拥有可移植代码(特别是如果它没有任何成本)。
答案 1 :(得分:1)
这不是未确定的,它确实是四个字节。然而,在代码中更清楚地阅读sizeof(*data_ptr)
而不是4
,因为只看到数字,读者可能会想知道4
来自何处。有关魔术常量主题的讨论,请参阅this wikipedia article。
答案 2 :(得分:1)
我认为这是由可移植性引起的:始终避免使用硬编码值。 Sizeof()在编译期间工作,因此在执行期间没有开销。
答案 3 :(得分:0)
sizeof(*data_ptr)
是解除引用指针的大小。我猜想uint32_t
是一个无符号的32位int,它是4个字节。 sizeof(uint32_t*)
为您提供指针的大小,这取决于您的体系结构(32位系统为4个字节,64位系统为8个字节)。