【发布时间】:2018-07-11 13:58:56
【问题描述】:
我试图了解使用 strnlen 的正确方法是什么,以便即使在考虑极端情况时也能安全使用它。
例如将非空终止字符串作为输入。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
void* data = malloc(5);
size_t len = strnlen((const char*)data, 10);
printf("len = %zu\n", len);
return 0;
}
如果我期望一个最大大小的字符串10,但该字符串在这 10 个字符中不包含空字符,strnlen 将读取超出边界字节(输入指针可能指向堆分配的数据)。这种行为是否未定义?如果是,有没有办法安全地使用strnlen 来计算考虑到这种情况并且不会导致未定义行为的字符串的长度?
【问题讨论】:
-
如果字符串不是以 NUL 结尾的,你如何定义它的长度?
-
要使用
strnlen(),第二个参数需要指定一个长度上限。在您的情况下,strnlen()的调用不应有超过5的第二个参数。如果您不尊重这一点,您将导致未定义的行为,并且没有办法解决。 -
问题是如何使用
strnlen并被标记为C,而不是如何避免strnlen并抛弃C。 -
C 安全方法可能是
strnlen或memchr