后面的strnlen的实现是否无效?

size_t strnlen(const char *str, size_t maxlen)
{
    char *nul = memchr(str, '\0', maxlen);
    return nul ? (size_t)(nul - str) : maxlen;
}

我认为memchr总是可以查看maxlen字节,无论这些字节的内容如何。如果没有NUL终止符,那么strnlen协定仅允许它查看所有maxlen字节吗?如果是这样,str的内存大小可能小于maxlen字节,在这种情况下memchr可能会尝试读取无效的内存位置。这样对吗?

最佳答案

是的,发布的实现是合规的:除了第一次出现memchr()之外,不应从str中读取字节。

C17 7.24.5.1 '\0'函数

简介

#include <string.h>
void *memchr(const void *s, int c, size_t n);

说明

memchr函数在memchr指向的对象的初始c字符(每个字符都解释为unsigned char)中定位首次出现n(转换为unsigned char)。该实现应表现为好像它顺序读取字符并在找到匹配字符后立即停止。

返回

s函数返回指向所定位字符的指针,如果该字符未出现在对象中,则返回空指针。
memchr可以通过高效的技术来实现,该技术一次测试多个字节,可能会读取超出第一个匹配字节的内容,但前提是这不会引起任何可见的副作用。

10-04 16:10