如何安全使用strnlen?

Nic*_*ick 1 c strlen

我试图了解正确的使用方法是什么,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;
}
Run Code Online (Sandbox Code Playgroud)

如果我期望一个最大大小10的字符串,但字符串不包含这10个字符内的空字符strnlen将读出边界字节(输入指针可能指向堆分配的数据).这种行为是不确定的?如果是,有没有办法安全地使用strnlen计算字符串的长度,考虑到这种类型的场景,并没有导致未定义的行为?

Bat*_*eba 5

为了strnlen安全使用,您需要

  1. 自己跟踪输入缓冲区的大小(在您的情况下为5)并将作为第二个参数传递,不是大于该数字的数字.

  2. 确保输入指针不是NULL.

  3. 确保另一个线程没有写入缓冲区.

在形式上,您不需要初始化缓冲区的内容,因为从概念上讲,该函数读取缓冲区就像它们是char类型一样.