Является ли реализация 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
байтов независимо от содержимого этих байтов. Разрешает ли контракт strnlen
просматривать все байты maxlen
, только если отсутствует терминатор NUL? Если это так, размер в памяти str
может быть меньше maxlen
байтов, в этом случае memchr
может попытаться прочитать недопустимые области памяти. Это правильно?