почитал:
https://www.usenix.org/legacy/event/usenix99/full_papers/millert/millert.pdf
и вижу, что они ссылаются на sprintf. А sprintf говорит, что возвращает: number of characters that would have been printed if the size were unlimited (again, not including the final \0').`
Хорошо. Допустим размер буфера куда мы сложим строку финальную бесконечен. Я подаю 0 как сайз или 1. В dst у меня лежит "aaa" с нуль байтом, как полагается а в src у меня, скажем, "bb" тоже с нуль байтом.
Результатом, внезапно, будет 2 при 0 и 3 при 1 в качестве сайза. Но если предположить что буфер бесконечен, то должно быть 5.
Какая логика у strlcat?
Функции не описаны стандартом, а значит у них такое поведение, какое реализовано. То есть надо читать код. Думаю, для strlcat задавать нулевой размер dst некорректно.
For strlcat() that means the initial length of dst plus the length of src. While this may seem somewhat confusing, it was done to make truncation detection simple.
Вот что гласит ман про 0 сайз: strlcat() appends string src to the end of dst. It will append at most dstsize - strlen(dst) - 1 characters. It will then NUL terminate, unless dstsize is 0 or the original dst string was longer than dstsize (in practice this should not happen as it means that either dstsize is incorrect or that dst is not a proper string). Действительно, тут говорится, что случаи когда размер строки в dst не совпадает с размером переданным в аргументе - это не айс. Про UB вроде ничего не сказано.
Обсуждают сегодня