wcslen или strlen должны предотвращать бесконечный цикл?

Эта функция подсчитывает количество символов между началом строки и завершающим нулевым символом.

size_t wcslen(const wchar_t* sz)
{
size_t l = 0;
while (*sz++) ++l;
return l;
}

Теперь, если нет завершающего нулевого символа, эта функция должна обнаружить это или нет? Как они обнаруживают? Есть ли предел для цикла, и он действительно не является бесконечным?

0

Решение

И как это сделать? Определение
длина — «до завершающего нулевого символа». «Более безопасная» версия функции может занять дополнительную максимальную длину,
которая будет соответствовать длине буфера, где
данные были проведены. Но использование строк с нулевым символом в конце
универсальный в C, и большую часть времени, если вы называете это
функция, потому что вызывающая вас функция только дала вам
указатель, и вы не знаете фактическую длину буфера.

На практике, если вход не имеет завершающего нуля
персонаж, вы получите переполнение буфера, чтение памяти за
конец вашего буфера. При этом, рано или поздно, вы будете
либо встретить байт, который содержит 0, и считать, что
конец вашей строки, или вы получите адрес, который
не отображается в вашем процессе, и вы потерпите крах.

2

Другие решения

Эта функция останавливается на первом значении 0, если нет wchar_t с 0 в конце параметра sz, она будет продолжаться в оставшейся части памяти до достижения значения 0

2

Если для строки нет нулевого терминатора, поведение не определено. Вы не можете сказать, что вы получите.

1

Ну, контракт заключается в том, что вы поставляете строку, заканчивающуюся NUL. Если вы этого не сделаете, все ставки выключены, и поведение функции не определено.

1

Если нет нулевого терминатора (хотя у меня проблемы с представлением пространства памяти, заполненного мусором без нулей), то в конечном итоге sz переполнится, после чего вы попытаетесь разыменовать NULL, что даст вам исключение.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector