我试图了解使用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来计算字符串的长度,这种方法考虑了这种情况,并且不会导致未定义的行为?

最佳答案

为了安全使用strnlen,您需要
自己跟踪输入缓冲区的大小(在您的情况下为5),并将其作为第二个参数传递,而不是大于该值的数字。
确保输入指针不NULL
确保另一个线程没有写入缓冲区。
形式上,您不需要初始化缓冲区的内容,因为从概念上讲,函数读取缓冲区的方式就好像它们是char类型一样。

关于c - 如何安全使用strnlen?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51287436/

10-13 04:47