首页 > 解决方案 > 将 ptrdiff_t 的正值分配给 size_t 是否安全

问题描述

我试图实现功能,我在linux 内核strlen中遇到了这个实现:

size_t strlen(const char *s)
{
    const char *sc;

    for (sc = s; *sc != '\0'; ++sc)
        /* nothing */;
    return sc - s;
}

根据 C 标准,该操作的最佳拟合类型sc - s是 ptrdiff_t。

现在在这个片段中,sc保证大于或等于0,这意味着我们没有返回负类型的风险。

对于正值,返回sc - c为是否安全size_t?换句话说,在现实世界中,实现是否有可能PTRDIFF_MAX大于SIZE_MAX


这是我的实现strlen

size_t strlen(const char *s)
{
    size_t size = 0;

    while (*s != '\0') {
        size++;
        s++;
    }

    return size;
}

标签: clanguage-lawyer

解决方案


是的,如果传递有效对象是安全的,因为 2 个指针的减法只能使用指向同一对象的指针来完成。

6.5.6 加法运算符

  1. 当两个指针相减时,两者都应指向同一个数组对象的元素,或者指向数组对象的最后一个元素;结果是两个数组元素的下标之差。...

由于sizeof运算符最多可以返回SIZE_MAX,因此表达式sc - s永远不会返回大于该值的值。


推荐阅读