Я пытаюсь понять, как правильно использовать 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()
, во втором аргументе необходимо указать верхний предел длины. В вашем случае вызовstrnlen()
не должен иметь второй аргумент, превышающий5
. Если вы не будете уважать это, вы вызовете неопределенное поведение, и это невозможно обойти. - person Peter   schedule 11.07.2018strnlen
и помечен буквой C, а не в том, как избежатьstrnlen
и отказаться от C. - person Christian Gibbons   schedule 11.07.2018strnlen
илиmemchr
- person Jose   schedule 11.07.2018