sizeof dereferenced指针未确定?

时间:2016-05-20 05:02:15

标签: c linux pointers driver sizeof

Linux内核中的代码(可能是驱动程序):

https://us.codeaurora.org/cgit/quic/la/kernel/msm/tree/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c?id=38110df3021daf7740018f4b5cc61423c7382aac

检查* 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)

实际上这是一项安全检查,此处出现漏洞。该代码稍后修补:

https://us.codeaurora.org/cgit/quic/la//kernel/msm/commit/?id=8ad163e831a2b2c30551edb360f168a604cdb0bb

4 个答案:

答案 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个字节)。